#pragma optimize的代码有多便携?

sha*_*oth 5 c c++ compiler-construction portability pragma

使用的代码有多便携#pragma optimize?大多数编译器是否支持它以及对此的支持有多完整#pragma

Seb*_*ach 11

#pragma是编译人员添加非认可和非便携式语言扩展的认可和可移植的方式*.

基本上,你永远不会确定,并且至少有一个主要的C++编译器(g ++)不支持这个pragma.


*:

从C++标准(N3242):

16.6 Pragma指令[cpp.pragma]

表单的预处理指令

# pragma pp-tokens 选择新线

导致实现以实现定义的方式运行.该行为可能导致转换失败或导致转换程序或生成的程序以不符合的方式运行.将忽略实现无法识别的任何编译指示.

根据C标准(委员会草案 - 2011年4月12日):

6.10.6 Pragma指令

语义

表单的预处理指令

# pragma pp-tokens 选择新线

其中预处理令牌STDC不会立即跟pragma在指令中(在任何宏替换之前)174)导致实现以实现定义的方式运行.该行为可能导致转换失败或导致转换程序或生成的程序以不符合的方式运行.任何 pragma未被实现识别的内容都将被忽略.

这是一个例子:

int main () {
    #pragma omp parallel for
    for (int i=0; i<16; ++i) {}
}
Run Code Online (Sandbox Code Playgroud)

C和C++ OpenMP API的很大一部分是作为#pragmas 实现的.


Ben*_*enj 6

通常,依靠编译器标志不是一个好主意,因为每个编译器都有自己的行为.

不应使用此标志,因为它是您注入代码的编译级别规范.

通常和理论上,如果不使用,编译器应该忽略该标志.