我有一个已清除所有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,但这样代码只是默默地省略而不是错误输出。
想法?
答案 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_
。如果找到任何此类字符串,则失败。