C预处理宏-定义与值的可移植性和实践

5

对于特定编译器代码,常见的cpp指令如下:

#if defined (__GNUC__) && (__GNUC__ >= 4)

这是我通常使用的预处理器测试 - 不仅限于__GNUC__,但这是一个常见的例子。另外,

#if (__GNUC__ >= 4)

似乎也能满足同样的要求。后一种方法是否存在潜在问题?不仅适用于gcc,还适用于符合标准的任何预处理器。即使未定义,左侧是否会被评估为某个值?是否有任何语言专家注意到第二种方法的任何陷阱?

2个回答

6

预处理器假定未定义的宏在比较中的值为0,所以在这种情况下您的简化是可以的。如果您想要针对低于 gcc 4 的版本进行检查,则可能会遇到问题,因为使用 < 比较时即使不是 gcc,它也会计算为true

我认为同时使用两者的原因也与可理解性有关,如果您检查

#if defined(__GNUC__) && (__GNUC>=4)

很明显,您并没有在只适用于GCC的代码块中,而简化代码如下:

#if (__GNUC__ >= 4)

这并不明显,只有当你已经知道它是gcc时,才能将其视为版本检查。


完全同意第一种选择更好,因为它使意图更明显,而且没有任何成本。它还避免了可能出现的“穿透”错误,在多个编译器/平台情况下进行评估。 - Brett Hale

2
在GNUC案例中,当你反过来测试时,它会做错事:
#if (__GNUC__ < 4)

我认为即使没有定义GNUC,这个也是正确的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接