#pragma
是编译器添加未经批准且不可移植语言扩展*的认可且可移植方式。
基本上,你永远无法确定,并且至少有一个主要的 C++ 编译器 (g++) 不支持此编译指示。
*:
来自 C++ 标准 (N3242):
16.6 Pragma 指令 [cpp.pragma]
表单的预处理指令
pp-tokensopt换行# pragma
使实现按照实现定义的方式运行。该行为可能会导致翻译失败或导致翻译器或生成的程序以不合格的方式运行。任何未被实现识别的编译指示都会被忽略。
来自 C 标准(委员会草案 — 2011 年 4 月 12 日):
6.10.6 Pragma 指令
语义
表单的预处理指令
pp-tokensopt换行# pragma
其中预处理标记
并不紧跟在STDC
之后 指令(在任何宏替换之前)174)导致实现以 实现定义的方式。该行为可能会导致翻译失败或导致 翻译器或生成的程序以不合格的方式运行。任何这样的pragma
未被实现识别的将被忽略。pragma
这是一个例子:
int main () {
#pragma omp parallel for
for (int i=0; i<16; ++i) {}
}
C 和 C++ OpenMP API 的很大一部分是作为
#pragma
实现的。
通常依赖编译器标志并不是一个好主意,因为每个编译器都有自己的行为。
不应使用此标志,因为它是您注入代码中的编译级别规范。
通常和理论上,如果不使用该标志,编译器应忽略该标志。
#pragma
关键字是可移植的,因为它应该始终在编译器上进行编译。但是,编译指示是特定于编译器的,因此在更改编译器时它可能会发出一些警告。有些编译指示被广泛使用,例如来自 OpenMP 的编译指示。为了使代码尽可能可移植,您可以使用 #ifdef
/#endif
包围您的编译指示,这取决于您所使用的编译器。例如:
#ifdef __ICC
#pragma optimize
#endif
编译器通常会定义一些宏,例如
__ICC
,使代码知道正在使用哪个编译器。
#pragma
不可携带,句号。有一个 gcc 版本,每当遇到这个问题时就会启动游戏
我们工作中使用的编译器中,有两个肯定不支持
#pragma optimise
,其他的我无法回答。
即使他们这样做了,由于用于优化的命令行开关不同,编译指示的选项也可能会不同。