使用 #pragma optimization 的代码的可移植性如何?

问题描述 投票:0回答:5

使用

#pragma optimize
的代码的可移植性如何?大多数编译器都支持它吗?对此的支持有多完整
#pragma

c++ c portability pragma
5个回答
12
投票

#pragma
是编译器添加未经批准且不可移植语言扩展*认可且可移植方式。

基本上,你永远无法确定,并且至少有一个主要的 C++ 编译器 (g++) 不支持此编译指示。


*:

来自 C++ 标准 (N3242):

16.6 Pragma 指令 [cpp.pragma]

表单的预处理指令

# pragma
pp-tokensopt换行

使实现按照实现定义的方式运行。该行为可能会导致翻译失败或导致翻译器或生成的程序以不合格的方式运行。任何未被实现识别的编译指示都会被忽略。

来自 C 标准(委员会草案 — 2011 年 4 月 12 日):

6.10.6 Pragma 指令

语义

表单的预处理指令

# pragma
pp-tokensopt换行

其中预处理标记

STDC
并不紧跟在
pragma
之后 指令(在任何宏替换之前)174)导致实现以 实现定义的方式。该行为可能会导致翻译失败或导致 翻译器或生成的程序以不合格的方式运行。任何这样的
pragma
未被实现识别的将被忽略。

这是一个例子:

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

C 和 C++ OpenMP API 的很大一部分是作为

#pragma
实现的。


6
投票

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

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

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


4
投票

#pragma
关键字是可移植的,因为它应该始终在编译器上进行编译。但是,编译指示是特定于编译器的,因此在更改编译器时它可能会发出一些警告。有些编译指示被广泛使用,例如来自 OpenMP 的编译指示。为了使代码尽可能可移植,您可以使用
#ifdef
/
#endif
包围您的编译指示,这取决于您所使用的编译器。例如:

#ifdef __ICC
   #pragma optimize
#endif

编译器通常会定义一些宏,例如

__ICC
,使代码知道正在使用哪个编译器。


2
投票

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

例如: GNU、英特尔和 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
的具体问题,它是由gccmicrosoft支持的,但这并不意味着将来会如此。


2
投票

#pragma
不可携带,句号。有一个 gcc 版本,每当遇到这个问题时就会启动游戏

我们工作中使用的编译器中,有两个肯定不支持

#pragma optimise
,其他的我无法回答。

即使他们这样做了,由于用于优化的命令行开关不同,编译指示的选项也可能会不同。

© www.soinside.com 2019 - 2024. All rights reserved.