如果必需的标志不存在,则编译失败。

12

我有一些遗留代码需要传递某些gcc标志。我可以为这些标志添加预处理器检查吗?

例如,假设我需要-fno-strict-aliasing,我能否像下面这样做:

#ifndef _FNO_STRICT_ALIASING
   #error -fno-strict-aliasing is required!
#endif

听起来像是Make应该能够做到的事情。 - user195488
@Code Monkey: 当然可以通过make传递标志。但是如果源代码转移到新的make系统中,这些知识可能会丢失(例如,如果您要将源代码分发给一个库)。我希望代码本身知道它需要什么。这样更符合DRY原则 :) - paleozogt
2个回答

6

您可以使用

#pragma GCC optimize "no-strict-aliasing"

使用该标志编译文件(覆盖命令行中指定的内容)。 您还可以使用

__attribute__((optimize("no-strict-aliasing")))

在源文件中将标志应用于单个函数...


啊!比我要求的还要好! - paleozogt
最好还是修复需要这个标志的破损代码,使其成为真正有效的C代码。 - R.. GitHub STOP HELPING ICE
哦不:在没有启用严格别名的情况下使用#pragma指令是无效的:https://bugzilla.redhat.com/show_bug.cgi?id=486176 - paleozogt
当然可以,但我们通常无法控制代码是否可以更改。在我的情况下,代码是由SWIG生成的。 - paleozogt
SWIG是开源的,我敢打赌作者会接受补丁... :-) - Nemo

3

在我的GCC版本中,这绝对没有#定义。

要查看所有预定义的预处理器符号:

g++ -dM -E - < /dev/null

我认为没有任何方法可以测试这些选项。但是,如果您使用的是GCC 4.4或更高版本,则可以使用"optimize"函数属性"#pragma optimize"在每个函数或每个文件的基础上启用特定选项。

例如,如果您将此添加到公共标头文件中:

#if defined(__GNUC__)
#pragma GCC optimize ("no-strict-aliasing")
#else
#error "You are not using GCC"
#endif

我希望它能够为包括头文件的每个文件启用该选项。

[更新]

好吧,我用了大约10分钟才写完这个答案。我还是会把它留在这里,因为里面有指向GCC文档的链接。


1
哦不:在没有启用严格别名的情况下使用#pragma指令是无效的:https://bugzilla.redhat.com/show_bug.cgi?id=486176 - paleozogt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接