共用方式為


Pragma 指示詞和 __Pragma 關鍵字

Pragma 指示詞會指定電腦專屬或作業專屬的編譯器功能。 Microsoft 編譯器專有的 __pragma 關鍵字可讓您在巨集定義範圍內撰寫 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:

alloc_text

auto_inline

bss_seg

check_stack

code_seg

comment

component

conform1

const_seg

data_seg

deprecated

detect_mismatch

fenv_access

float_control

fp_contract

function

hdrstop

include_alias

init_seg1

inline_depth

inline_recursion

intrinsic

loop1

make_public

managed

message

omp

once

optimize

pack

pointers_to_members1

pop_macro

push_macro

region、endregion

runtime_checks

section

setlocale

strict_gs_check

unmanaged

vtordisp1

warning

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

Pragma 和編譯器選項

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

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 關鍵字。 這段程式碼摘錄自<編譯器 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; \

結束 Microsoft 專有

請參閱

參考

C Pragma

C++ 關鍵字

其他資源

C/C++ 前置處理器參考