Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Chỉ thị #pragma trong C/C++

#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)

MSVC-specific pragmas

DirectiveMô 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 identifierCấm dùng identifier (báo lỗi nếu dùng)
#pragma message "text"In thông báo compile-time
#pragma onceInclude 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

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
DirectiveMô 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