Pragma 指示詞和 __pragma_Pragma 關鍵字

Pragma 指示詞會指定電腦特定或作業系統特定的編譯器功能。 開頭 #pragma 為 的行會 pragma 指定 指示詞。 Microsoft 特定的 __pragma 關鍵字可讓您在巨集定義內撰寫 pragma 指示詞。 C99 中引進且由 C++11 採用的標準 _Pragma 預處理器運算子類似。

語法

#pragmatoken-string
__pragma(token-string ) // 兩個前置底線 - Microsoft 特定的擴充功能
_Pragma(string-literal ) // C99

備註

C 和 C++ 的每個實作都支援其主機電腦或作業系統獨有的一些功能。 例如,某些程式必須精確控制記憶體中資料的位置,或控制某些函式接收參數的方式。 指示 #pragma 詞可讓每個編譯器提供機器和作業系統特定功能,同時維持與 C 和 C++ 語言的整體相容性。

Pragma 指示詞依定義是電腦特定或作業系統特定的,而且每個編譯器通常不同。 pragma可用於條件式指示詞,以提供新的預處理器功能。 或者,使用其中一個來提供實作定義的資訊給編譯器。

Token-string 是一系列字元,代表特定編譯器指令和引數,如果有的話。 數位記號 ( # ) 必須是包含 pragma 的行上第一個非空白字元。 空白字元可以分隔數位記號和 「 pragma 」 一字。 在 之後 #pragma ,撰寫翻譯工具可剖析為前置處理標記的任何文字。 的引數 #pragma 受限於宏擴充。

字串常值 是 的 _Pragma 輸入。 移除外引號和開頭/尾端空白字元。 \" 會取代為 " ,並以 \\ 取代 \

編譯器在發現 pragma 無法辨識的 時發出警告,並繼續編譯。

Microsoft C 和 C++ 編譯器可辨識下列 pragma 指示詞:

1 只有 C++ 編譯器支援。

Pragma 指示詞和編譯器選項

某些 pragma 指示詞提供與編譯器選項相同的功能。 pragma在原始程式碼中到達 時,它會覆寫編譯器選項所指定的行為。 例如,如果您指定 /Zp8 ,您可以使用 來覆寫程式碼 pack 特定區段的這個編譯器設定:

cl /Zp8 some_file.cpp
// some_file.cpp - packing is 8
// ...
#pragma pack(push, 1) - packing is now 1
// ...
#pragma pack(pop) - packing is 8 again
// ...

__pragma 關鍵字

編譯器也支援 Microsoft 特定 __pragma 關鍵字,其功能與 #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; \

_Pragma前置處理運算子

_Pragma 類似于 Microsoft 特定的 __pragma 關鍵字。 它已導入 C99 中的 C 標準,以及 C++11 中的 C++ 標準。 只有在您指定 /std:c11/std:c17 選項時,才能在 C 中使用。 針對 C++,其適用于所有 /std 模式,包括預設值。

不同于 #pragma_Pragma 可讓您將指示詞放入 pragma 巨集定義中。 字串常值應該是您在語句之後所放置的內容 #pragma 。 例如:

#pragma message("the #pragma way")
_Pragma ("message( \"the _Pragma way\")") 

應逸出引號和反斜線,如上所示。 pragma忽略無法辨識的字串。

下列程式碼範例示範如何在 _Pragma 類似判斷提示的宏中使用 關鍵字。 它會建立 pragma 指示詞,在條件運算式恰好為常數時隱藏警告。

巨集定義會使用 do ... while(0) 多語句宏的慣用語,讓它可以像一個語句一樣使用。 如需詳細資訊,請參閱 Stack Overflow 上的 C 多行宏 。 範例 _Pragma 中的 語句只會套用至後面的程式程式碼。

// Compile with /W4

#include <stdio.h>
#include <stdlib.h>

#define MY_ASSERT(BOOL_EXPRESSION) \
    do { \
        _Pragma("warning(suppress: 4127)") /* C4127 conditional expression is constant */  \
        if (!(BOOL_EXPRESSION)) {   \
            printf("MY_ASSERT FAILED: \"" #BOOL_EXPRESSION "\" on %s(%d)", __FILE__, __LINE__); \
            exit(-1); \
        } \
    } while (0)

int main()
{
    MY_ASSERT(0 && "Note that there is no warning: C4127 conditional expression is constant");

    return 0;
}

另請參閱

C/C++ 預處理器參考
C pragma 指示詞
關鍵字