Share via


杂注指令和__Pragma关键字

杂注指令指定计算机或操作系统特定编译器功能。 __pragma关键字,是特定于 Microsoft 编译器,可使您能够在宏的定义代码杂注指令。

#pragma token-string
__pragma(token-string)

备注

每个 C 和 C++ 的实现支持其宿主计算机或操作系统特有的一些功能。 例如,某些程序中,必须执行精确地控制放置数据的内存区域,或控制的某些函数接收参数的方法。 #pragma指令提供了一种方法,每个编译器可以提供特定于计算机和操作系统功能,同时保留与 C 和 C++ 语言的总体兼容性。

杂注为计算机或操作系统特定的定义,并为每个编译器通常不同。 杂注可在条件语句中,以提供新的预处理器功能,或提供给编译器实现定义的信息。

token-string是为特定的编译器指令和参数),提供了一系列的字符,如果有的话。 在数字符号 (#) 必须是包含杂注 ; 在行上的第一个非空白字符 空白字符可以分隔数字的符号和"杂注"一词。 按照#pragma,编写翻译人员可以分析为预处理标记任何文本。 若要将参数#pragma于宏展开。

如果编译器找到无法识别的杂注,它将发出警告并继续进行编译。

Microsoft C 和 C++ 编译器识别下列杂注:

alloc_text

auto_inline

bss_seg

check_stack

code_seg

注释

组件

conform1

const_seg

data_seg

不建议使用

detect_mismatch

fenv_access

float_control

fp_contract

function

hdrstop

include_alias

init_seg1

inline_depth

inline_recursion

intrinsic

loop1

make_public

管理

消息

omp

一次

optimize

pack

pointers_to_members1

pop_macro

push_macro

region, endregion

runtime_checks

部分

setlocale

strict_gs_check

非托管

vtordisp1

warning — 警告

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 特定

请参见

参考

C说明

C++关键字

其他资源

C/C++预处理器引用