C预处理器宏 - 定义与价值可移植性&实践

时间:2012-03-10 07:50:53

标签: gcc c-preprocessor

对于特定于编译器的代码,通常会看到cpp指令,例如:

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

这是我通常使用的预处理器测试 - 不仅仅是__GNUC__,但它是一个常见的例子。可替代地,

#if (__GNUC__ >= 4)

似乎满足相同的要求。后者有潜在的问题吗?不仅与gcc,而且任何符合标准的预处理器。 LHS是否可以评估为某个值,即使它没有定义?对于任何语言律师都知道的第二种方法是否有任何陷阱?

2 个答案:

答案 0 :(得分:5)

预处理器假设未定义的宏在比较中具有值0,因此在这种情况下您的简化是正确的。如果你想在gcc中检查低于4的版本,你可能会遇到麻烦,因为即使它不是gcc,它也会被true评估为<

我认为如果你检查

,使用两者的原因也是可理解性的问题
#if defined(__GNUC__) && (__GNUC>=4)

很明显,你已经在一个只有GCC代码的块中,而简化

#if (__GNUC__ >= 4)

没有那么明显,只有当你已经知道它是gcc时才可以作为版本检查阅读。

答案 1 :(得分:2)

在GNUC案例中,当你以相反的方式测试它时,它会做错事:

#if (__GNUC__ < 4)

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