Pragma 指示詞和 __pragma
和 _Pragma
關鍵字
Pragma 指示詞會指定電腦特定或作業系統特定的編譯器功能。 開頭 #pragma
為 的行會 pragma 指定 指示詞。 Microsoft 特定的 __pragma
關鍵字可讓您在巨集定義內撰寫 pragma 指示詞。 C99 中引進且由 C++11 採用的標準 _Pragma
預處理器運算子類似。
語法
#pragma
token-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 指示詞:
alloc_text
auto_inline
bss_seg
check_stack
code_seg
comment
component
conform
1
const_seg
data_seg
deprecated
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;
}
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應