#pragma optimize的代码有多便携?

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

#pragma是编译器添加非认可和非可移植语言扩展*认可且可移植的方式。

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


*

从C ++标准(N3242):

16.6 Pragma指令[cpp.pragma]

表单的预处理指令

# pragma pp-tokens opt new-line

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

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

6.10.6 Pragma指令

语义

表单的预处理指令

# pragma pp-tokens opt new-line

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

这是一个例子:

 int main () { #pragma omp parallel for for (int i=0; i<16; ++i) {} } 

C和C ++ OpenMP API的很大一部分是作为#pragma s实现的。

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

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

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

#pragma关键字是可移植的,因为它应该始终在编译器上编译。 但是,pragma是特定于编译器的,因此在更改编译器时可能会抱怨一些警告。 一些pragma被广泛使用,例如OpenMP中的这些。 为了使代码尽可能便于使用,您可以使用依赖于您正在使用的编译器的#ifdef / #endif来包围您的编译指示。 例如:

 #ifdef __ICC #pragma optimize #endif 

编译器通常定义一些宏,例如__ICC ,使代码知道正在使用哪个编译器。

#pragma任何使用都是特定于编译器的。

例如 :GNU,Intel和IBM:

 #warning "Do not use ABC, which is deprecated. Use XYZ instead." 

微软:

 #pragma message("Do not use ABC, which is deprecated. Use XYZ instead.") 

关于#pragma optimize的具体问题, gcc和microsoft支持它,但并不意味着它将来会出现。

#pragma不可移植,完全停止。 有一个版本的gcc,只要碰到它就用来开始游戏

在我们工作中使用的编译器中,有两个肯定不支持#pragma optimise ,而我无法回答其他编译器。

即使他们这样做,因为用于优化的命令行开关是不同的,pragma的选项可能会有所不同。