有GCC毒药的方法只适用于源而不是命令行?

时间:2014-05-07 14:40:15

标签: c gcc c-preprocessor

我有一个已清除所有PLATFORM_X ifdef的文件,目的是保持这种方式,使其与平台无关。

所以我在源代码中添加了以下内容,以鼓励人们不再使用ifdef PLATFORM_X添加黑客攻击

#pragma GCC poison PLATFORM_X

#ifdef PLATFORM_X // compiler catches when a dev tries to add more hacky code
// bla bla 
#endif

但是,由于文件本身与该平台的每个其他文件一起使用-DPLATFORM_X进行编译,因此会触发警告。

./foo.c:3:20: error: poisoning existing macro "PLATFORM_X"

我真的希望毒药只触发源文件中的添加。这可能吗?

(在这种情况下修改makefile并不理想,因为这确实是一个全局定义)

另一种选择只是在毒性头文件中#undef PLATFORM_X,但这样代码只是默默地省略而不是错误输出。

想法?

3 个答案:

答案 0 :(得分:3)

在已清除#ifdef PLATFORM_X的文件中,您无需定义PLATFORM_X,因此请写

/* PLATFORM_X configuration macro is deprecated; do not add new uses. */
#undef PLATFORM_X
#pragma GCC poison PLATFORM_X

包含任何仍然可以使用宏的头文件。

请注意,从不需要在#undef中包裹#ifdef;如果应用于已经不是宏的标识符,#undef将无效。

答案 1 :(得分:2)

这应该有效:

#ifdef PLATFORM_X
#undef PLATFORM_X
#endif
#pragma GCC poison PLATFORM_X

(如果你愿意的话,请跳过#ifdef,但我只是想明确看待事情,品味问题。)

当然,如果Makefile定义它,它将无法捕获,因为我们只是未定义它。如果没有定义,上面应该没有区别。

答案 2 :(得分:0)

我更喜欢单元测试这样的事情。在您的情况下,编写一个单元测试,读取.h文件并搜索PLATFORM_。如果找到任何此类字符串,则失败。