Visual Studio 2012 - Visual C++ Pragma 指令和 __Pragma 關鍵字

雜注指令指定計算機或操作系統特定的編譯器功能。 __pragma 關鍵字是特定於 Microsoft 編譯器的,可利用它在宏定義中編碼雜注指令。

#pragma token-string
__pragma(token-string)

備註

C 和 C++ 的每個實現均支持某些對其主機或操作系統唯一的功能。 例如,某些程序必須對將數據放入的內存區域進行準確的控制或控制某些函數接收參數的方式。 在保留與 C 和 C++ 語言的總體兼容性的同時,#pragma 指令使每個編譯器均能夠提供特定於計算機和操作系統的功能。

根據定義,雜注是計算機或操作系統特定的,並且通常對於每個編譯器而言都有所不同。 雜注可用於條件語句以提供新的預處理器功能,或爲編譯器提供實現所定義的信息。

token-string 是一系列字符,這些字符提供了特定的編譯器指令和參數(如果有)。 數字符號 (#) 必須是位於包含雜注的行上的第一個非空白字符;空白字符可以分隔數字符號和詞“pragma”。 在 #pragma 之後,編寫轉換器可分析爲預處理標記的所有文本。 #pragma 的參數受宏展開的約束。

如果編譯器發現它無法識別的雜注,則它會發出警告並繼續編譯。

Microsoft C 和 C++ 編譯器識別以下雜注:

alloc_text

auto_inline

bss_seg

check_stack

code_seg

comment

component

conform 1

const_seg

data_seg

deprecated

detect_mismatch

fenv_access

float_control

fp_contract

function

hdrstop

include_alias

init_seg 1

inline_depth

inline_recursion

intrinsic

loop 1

make_public

managed

message

omp

once

optimize

pack

pointers_to_members 1

pop_macro

push_macro

region、endregion

runtime_checks

section

setlocale

strict_gs_check

unmanaged

vtordisp 1

warning

1. 僅受 C++ 編譯器支持。

雜注和編譯器選項

某些雜注提供與編譯器選項相同的功能。 在源代碼中遇到雜注時,將重寫編譯器選項所指定的行爲。 例如,如果您指定了 /Zp8,則可以使用 pack 爲代碼的特定部分重寫此編譯器設置。

cl /Zp8 …

- packing is 8
// …
#pragma pack(push, 1) - packing is now 1
// …
#pragma pack(pop) - packing is 8

2.__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; \
發佈了34 篇原創文章 · 獲贊 2 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章