杂注指令和__Pragma关键字
杂注指令指定计算机或操作系统特定编译器功能。 __pragma关键字,是特定于 Microsoft 编译器,可使您能够在宏的定义代码杂注指令。
#pragma token-string
__pragma(token-string)
备注
每个 C 和 C++ 的实现支持其宿主计算机或操作系统特有的一些功能。 例如,某些程序中,必须执行精确地控制放置数据的内存区域,或控制的某些函数接收参数的方法。 #pragma指令提供了一种方法,每个编译器可以提供特定于计算机和操作系统功能,同时保留与 C 和 C++ 语言的总体兼容性。
杂注为计算机或操作系统特定的定义,并为每个编译器通常不同。 杂注可在条件语句中,以提供新的预处理器功能,或提供给编译器实现定义的信息。
token-string是为特定的编译器指令和参数),提供了一系列的字符,如果有的话。 在数字符号 (#) 必须是包含杂注 ; 在行上的第一个非空白字符 空白字符可以分隔数字的符号和"杂注"一词。 按照#pragma,编写翻译人员可以分析为预处理标记任何文本。 若要将参数#pragma于宏展开。
如果编译器找到无法识别的杂注,它将发出警告并继续进行编译。
Microsoft C 和 C++ 编译器识别下列杂注:
loop1 |
||
1. 仅支持 C++ 编译器。
杂注和编译器选项
杂注提供编译器选项与相同的功能。 当在源代码中遇到杂注,则它将替代指定的编译器选项的行为。 例如,如果指定了 /Zp8,您可以重写的代码的特定部分的编译器设置 包:
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可在宏中使用关键字。 此代码被 excerpted 从 mfcdual.h 标头中的"编译器 COM 支持示例"ACDUAL 示例中:
#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 特定