使用#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的选项可能会有所不同。
以上就是c/c++开发分享#pragma optimize的代码有多便携?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560331.html