上一节: , 上一级: 设计建议   [目录][索引]


3.5 条件编译

当支持在构建程序时已知的配置选项时,我们倾向于使用 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