当支持在构建程序时已知的配置选项时,我们倾向于使用 if (...)
而不是条件编译,因为在前一种情况下,编译器能够对所有可能的代码路径执行更广泛的检查。
例如,请编写
if (HAS_FOO) ... else ...
而不是
#ifdef HAS_FOO ... #else ... #endif
像 GCC 这样的现代编译器在这两种情况下会生成完全相同的代码,并且我们在几个项目中成功地使用了类似的技术。当然,前一种方法假设 HAS_FOO
被定义为 0 或 1。
虽然这不是解决所有可移植性问题的灵丹妙药,而且并不总是合适,但遵循此策略每年可以为 GCC 开发人员节省数小时甚至数天的时间。
对于像 GCC 中的 REVERSIBLE_CC_MODE
这样不能简单地在 if (...)
语句中使用的类函数宏,有一个简单的解决方法。只需引入另一个宏 HAS_REVERSIBLE_CC_MODE
,如下例所示
#ifdef REVERSIBLE_CC_MODE #define HAS_REVERSIBLE_CC_MODE 1 #else #define HAS_REVERSIBLE_CC_MODE 0 #endif