我有一些需要传入的gcc标志的遗留代码。我可以为这些标志添加预处理器检查吗?如果需要的标志不存在,则编译失败
例如,假设我需要-fno-strict-aliasing
,我可以做这样的事情:
#ifndef _FNO_STRICT_ALIASING
#error -fno-strict-aliasing is required!
#endif
我有一些需要传入的gcc标志的遗留代码。我可以为这些标志添加预处理器检查吗?如果需要的标志不存在,则编译失败
例如,假设我需要-fno-strict-aliasing
,我可以做这样的事情:
#ifndef _FNO_STRICT_ALIASING
#error -fno-strict-aliasing is required!
#endif
肯定是有没有为它的#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文档。
哦,不:使用没有严格别名的编译指示不起作用:https://bugzilla.redhat.com/show_bug.cgi ?ID = 486176 – paleozogt
听起来像是应该做的事情。 – 2011-09-22 17:07:43
@Code Monkey:当然可以通过make传递标志。但是,如果源代码转移到可能会丢失知识的新制作系统(例如,如果您将源代码分发到lib)。我希望代码本身知道它需要什么。这样更干。 :) – paleozogt