雜注指令指定計算機或操作系統特定的編譯器功能。 __pragma 關鍵字是特定於 Microsoft 編譯器的,可利用它在宏定義中編碼雜注指令。
#pragma token-string
__pragma(token-string)
備註
C 和 C++ 的每個實現均支持某些對其主機或操作系統唯一的功能。 例如,某些程序必須對將數據放入的內存區域進行準確的控制或控制某些函數接收參數的方式。 在保留與 C 和 C++ 語言的總體兼容性的同時,#pragma 指令使每個編譯器均能夠提供特定於計算機和操作系統的功能。
根據定義,雜注是計算機或操作系統特定的,並且通常對於每個編譯器而言都有所不同。 雜注可用於條件語句以提供新的預處理器功能,或爲編譯器提供實現所定義的信息。
token-string 是一系列字符,這些字符提供了特定的編譯器指令和參數(如果有)。 數字符號 (#) 必須是位於包含雜注的行上的第一個非空白字符;空白字符可以分隔數字符號和詞“pragma”。 在 #pragma 之後,編寫轉換器可分析爲預處理標記的所有文本。 #pragma 的參數受宏展開的約束。
如果編譯器發現它無法識別的雜注,則它會發出警告並繼續編譯。
Microsoft C 和 C++ 編譯器識別以下雜注:
alloc_text
auto_inline
bss_seg
check_stack
code_seg
comment
component
conform 1
const_seg
data_seg
deprecated
detect_mismatch
fenv_access
float_control
fp_contract
function
hdrstop
include_alias
init_seg 1
inline_depth
inline_recursion
intrinsic
loop 1
make_public
managed
message
omp
once
optimize
pack
pointers_to_members 1
pop_macro
push_macro
region、endregion
runtime_checks
section
setlocale
strict_gs_check
unmanaged
vtordisp 1
warning
1. 僅受 C++ 編譯器支持。
雜注和編譯器選項
某些雜注提供與編譯器選項相同的功能。 在源代碼中遇到雜注時,將重寫編譯器選項所指定的行爲。 例如,如果您指定了 /Zp8,則可以使用 pack 爲代碼的特定部分重寫此編譯器設置。
cl /Zp8 …
- packing is 8
// …
#pragma pack(push, 1) - packing is now 1
// …
#pragma pack(pop) - packing is 8
2.__pragma() 關鍵字
Microsoft 專用
編譯器還支持 __pragma 關鍵字,該關鍵字具有與 #pragma 指令相同的功能,但可用於宏定義中的內聯。 #pragma 指令不能用於宏定義中,因爲編譯器會將指令中的數字符號(“#”)解釋爲字符串化運算符 (#)。
下面的代碼示例說明如何在宏中使用 __pragma 關鍵字。 此代碼摘自“編譯器 COM 支持示例”中的 ACDUAL 示例中的 mfcdual.h 頭:
#define CATCH_ALL_DUAL \
CATCH(COleException, e) \
{ \
_hr = e->m_sc; \
} \
AND_CATCH_ALL(e) \
{ \
__pragma(warning(push)) \
__pragma(warning(disable:6246)) /*disable _ctlState prefast warning*/ \
AFX_MANAGE_STATE(pThis->m_pModuleState); \
__pragma(warning(pop)) \
_hr = DualHandleException(_riidSource, e); \
} \
END_CATCH_ALL \
return _hr; \