Visual Studio 2012 - Visual C++ Pragma 指令和 __Pragma 关键字
2015-04-16 20:27
656 查看
杂注指令指定计算机或操作系统特定的编译器功能。 __pragma 关键字是特定于 Microsoft 编译器的,可利用它在宏定义中编码杂注指令。
#pragma token-string
__pragma(token-string)
根据定义,杂注是计算机或操作系统特定的,并且通常对于每个编译器而言都有所不同。 杂注可用于条件语句以提供新的预处理器功能,或为编译器提供实现所定义的信息。
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
某些杂注提供与编译器选项相同的功能。 在源代码中遇到杂注时,将重写编译器选项所指定的行为。 例如,如果您指定了 /Zp8,则可以使用 pack 为代码的特定部分重写此编译器设置。
cl /Zp8 …
- packing is 8
// …
#pragma pack(push, 1) - packing is now 1
// …
#pragma pack(pop) - packing is 8
编译器还支持 __pragma 关键字,该关键字具有与 #pragma 指令相同的功能,但可用于宏定义中的内联。 #pragma 指令不能用于宏定义中,因为编译器会将指令中的数字符号(“#”)解释为字符串化运算符 (#)。
下面的代码示例说明如何在宏中使用 __pragma 关键字。 此代码摘自“编译器 COM 支持示例”中的 ACDUAL 示例中的 mfcdual.h 头:
#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; \
相关文章推荐
- Visual Studio 2012 - Visual C++ 层次结构图
- C# 关键字 Visual Studio 2012
- Visual Studio 2012 Visual C++ 入门
- Visual Studio 2012 - Visual C++ MFC 类
- Visual Studio 2012 - Visual C++ MFC 类
- Visual Studio 2012 - Visual C++ MFC 类
- Visual C++利用Intel C++ 编译器提升多核性能与多媒体指令支持获取更高的程序效率与缩小程序体积
- Visual c++ 2012 软件错误
- 解决Visual Studio 2012 Natvis可视化无效
- Visual C++ 2012入门经典(第6版) 课后练习(第04章)
- Intel架构CPU的CPUID指令和Visual Studio的__cpuid/__cpuidex函数
- Visual Studio 2012密钥
- visual studio 2012 写入文件里面
- 如何在 Visual Studio 2012 控制 TFS 版控時要忽略哪些檔案
- Visual Studio 2012 keyboard shortcuts
- 64位win8的Visual Studio 2012配置freeglut
- opencv 2.46与visual studio 2012 配置方法
- Visual Studio 2012 Ultimate RTM 体验(附下载地址和KEY)
- Visual Studio 2012中使用自定义project properties
- IAR #pragma optimize 指令