Pragma 指示詞 」 和 「 __Pragma 關鍵字
Pragma 指示詞會指定電腦或操作特定編譯器功能。 __pragma關鍵字,也就是專屬於 Microsoft 編譯器,可讓您以程式碼在巨集定義中的 pragma 指示詞。
#pragma token-string
__pragma(token-string)
備註
每個 c 和 C++ 的實作會支援它的主機電腦或作業系統所特有的某些功能。 例如,某些程式中,必須運用上放置資料的記憶體區域,或控制某些函式會接收參數的方式,精確的控制。 #pragma指示詞會提供一個方法,讓每個編譯器可以提供機器和作業系統專屬的功能,同時又保留與 c 和 C++ 語言的整體相容性。
Pragma 電腦作業系統特定或根據定義,並且也通常是不同的每個編譯器。 Pragma 可用在條件陳述式,以提供新的前置處理器功能,或提供給編譯器實作定義的資訊。
token-string是一系列的字元,以提供特定的編譯器指令和引數,如果有的話。 數字符號 (#) 必須是包含 pragma ; 那一行上的第一個非空格字元 數字符號和"pragma"這個字的泛空白字元可以區隔。 遵循#pragma,撰寫轉換程式可剖析成語彙基元的前置處理作業的任何文字。 引數為#pragma受限於巨集展開。
如果編譯器發現無法辨識的 pragma,它會發出警告,並會繼續編譯。
Microsoft c 和 C++ 編譯器會辨識下列 pragma:
loop1 |
||
1. 僅支援 C++ 編譯器。
Pragma,編譯器選項
某些程式結合提供相同的功能與編譯器選項。 在原始程式碼中發生的 pragma 時,它會覆寫指定的編譯器選項的行為。 比方說,如果您指定 /Zp8,您可以覆寫的程式碼的特定部分的編譯器設定 封包:
cl /Zp8 ...
<file> - packing is 8
// ...
#pragma pack(push, 1) - packing is now 1
// ...
#pragma pack(pop) - packing is 8
</file>
__Pragma() 關鍵字
特定的 Microsoft
編譯器也支援__pragma關鍵字具有相同的功能,可做為#pragma指示詞,但可能會使用的內嵌在巨集定義中。 #pragma指示詞不能用在巨集定義,因為編譯器會將數字符號字元 ('#') 解譯為指示詞中字串化運算子 (#)。
下列程式碼範例會示範如何__pragma可以在巨集中使用關鍵字。 這段程式碼節錄了一部分從 mfcdual.h 中的標頭中"編譯器 COM 支援範例"ACDUAL 範例:
#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; \
結束 Microsoft 特定