2.1.3 _Pragma操作符

在C/C++标准中,#pragma是一条预处理的指令(preprocessor directive)。简单地说,#pragma是用来向编译器传达语言标准以外的一些信息。举个简单的例子,如果我们在代码的头文件中定义了以下语句:


pragma once


那么该指令会指示编译器(如果编译器支持),该头文件应该只被编译一次。这与使用如下代码来定义头文件所达到的效果是一样的。


ifndef THIS_HEADER

define THIS_HEADER

//一些头文件的定义

endif


在C++11中,标准定义了与预处理指令#pragma功能相同的操作符_Pragma。_Pragma操作符的格式如下所示:


_Pragma(字符串字面量)


其使用方法跟sizeof等操作符一样,将字符串字面量作为参数写在括号内即可。那么要达到与上例#pragma类似的效果,则只需要如下代码即可。


_Pragma("once");


而相比预处理指令#pragma,由于_Pragma是一个操作符,因此可以用在一些宏中。我们可以看看下面这个例子:


define CONCAT(x)PRAGMA(concat on#x)

define PRAGMA(x)_Pragma(#x)

CONCAT(..\concat.dir)


这里,CONCAT(..\concat.dir)最终会产生_Pragma(concat on"..\concat.dir")这样的效果(这里只是显示语法效果,应该没有编译器支持这样的_Pragma语法)。而#pragma则不能在宏中展开,因此从灵活性上来讲,C++11的_Pragma具有更大的灵活性。