#pragma cung cấp thông tin bổ sung cho compiler, kích hoạt tính năng đặc thù compiler/vendor. Không chuẩn hóa hoàn toàn - khác nhau giữa GCC, MSVC, Clang.
Cú pháp chung
#pragma tên_chỉ_thị
Các #pragma phổ biến (GCC/Clang)
| Directive | Mô tả |
#pragma GCC dependency "file" | Cảnh báo nếu file phụ thuộc mới hơn file hiện tại |
#pragma GCC system_header | Đối xử file hiện tại như system header (tắt warning) |
#pragma GCC poison identifier | Cấm dùng identifier (báo lỗi nếu dùng) |
#pragma message "text" | In thông báo compile-time |
#pragma once | Include guard (hầu như mọi compiler hỗ trợ) |
#pragma pack(n) | Đặt alignment cấu trúc (1,2,4,8,16) |
#pragma GCC optimize("O3") | Tối ưu hóa cho hàm/file cụ thể |
#pragma GCC target("avx2") | Yêu cầu instruction set cho hàm |
MSVC-specific pragmas
| Directive | Mô tả |
#pragma comment(lib, "name") | Link thư viện tự động |
#pragma warning(push/pop) | Lưu/khôi phục trạng thái warning |
#pragma warning(disable: 4996) | Tắt warning cụ thể |
#pragma pack(push, 1) | Đặt alignment, lưu trạng thái cũ |
#pragma execution_character_set("utf-8") | Encoding cho string literal |
Ví dụ: Startup/Exit function (C cũ, ít dùng)
#include <stdio.h>
void startup_func() { printf("Startup\n"); }
void exit_func() { printf("Exit\n"); }
#pragma startup startup_func // Chạy TRƯỚC main (chỉ một số compiler cũ)
#pragma exit exit_func // Chạy SAU main
int main() {
printf("In main\n");
return 0;
}
Lưu ý: #pragma startup/exit không được chuẩn hóa, không hoạt động trên GCC/Clang/MSVC hiện đại. Dùng constructor attribute hoặc static object.
Ví dụ thực tế hữu ích
1. #pragma once - Include guard hiện đại
// header.h
#pragma once
// Không cần #ifndef HEADER_H ... #endif
2. #pragma pack - Cấu trúc nén
#pragma pack(push, 1)
struct Packed {
char c; // 1 byte
int i; // 4 bytes - không padding
}; // Size = 5 thay vì 8
#pragma pack(pop)
3. #pragma GCC poison - Cấm API cũ
#pragma GCC poison gets sprintf strcpy
// Bây giờ dùng gets() → compile error
4. #pragma message - Build info
#pragma message("Compiling with custom config")
#if DEBUG
#pragma message("DEBUG build")
#endif
Lưu ý
#pragma không chuẩn → code không portable
- Compiler không hiểu pragma sẽ bỏ qua (không lỗi)
- Ưu tiên attribute C++11:
[[deprecated]], [[nodiscard]], alignas
- Dùng
_Pragma("...") trong macro