Pragma 指示詞和 __pragma_Pragma 關鍵詞

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

語法

#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 指示詞
關鍵字