2011-09-22 50 views
12

我有一些需要传入的gcc标志的遗留代码。我可以为这些标志添加预处理器检查吗?如果需要的标志不存在,则编译失败

例如,假设我需要-fno-strict-aliasing,我可以做这样的事情:

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

听起来像是应该做的事情。 – 2011-09-22 17:07:43

+0

@Code Monkey:当然可以通过make传递标志。但是,如果源代码转移到可能会丢失知识的新制作系统(例如,如果您将源代码分发到lib)。我希望代码本身知道它需要什么。这样更干。 :) – paleozogt

回答

6

您可以使用

#pragma GCC optimize "no-strict-aliasing" 

编译文件与标志(重写什么规定上命令行)。 您还可以使用

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

到源文件中的标志适用于一个单一的功能...

+0

啊!甚至比我所要求的更好! – paleozogt

+0

最好还是修复需要此标志的破解代码,以便它确实有效C. –

+0

哦否:使用没有严格别名的编译指示不起作用:https://bugzilla.redhat.com/ show_bug.cgi?id = 486176 – paleozogt

3

肯定是有没有为它的#define,至少在我的版本的GCC。

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

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

我不认为有什么办法来测试这些选项。但是,如果您使用的是GCC 4.4或更高版本,则可以使用"optimize" function attribute"optimize" #pragma在每个功能或每个文件的基础上启用特定的选项。

举例来说,如果你将它添加到一个共同的头文件:

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

...它应该能为每个包含头文件的选项。

[更新]

行,所以我花了大约10分钟太长,组成这个答案。无论如何,我将把它留在这里,以便链接到GCC文档。

+1

哦,不:使用没有严格别名的编译指示不起作用:https://bugzilla.redhat.com/show_bug.cgi ?ID = 486176 – paleozogt