对于特定于编译器的代码,通常会看到cpp指令,例如:
#if defined (__GNUC__) && (__GNUC__ >= 4)
这是我通常使用的预处理器测试 - 不仅仅是__GNUC__
,但它是一个常见的例子。可替代地,
#if (__GNUC__ >= 4)
似乎满足相同的要求。后者有潜在的问题吗?不仅与gcc,而且任何符合标准的预处理器。 LHS是否可以评估为某个值,即使它没有定义?对于任何语言律师都知道的第二种方法是否有任何陷阱?
答案 0 :(得分:5)
预处理器假设未定义的宏在比较中具有值0
,因此在这种情况下您的简化是正确的。如果你想在gcc中检查低于4的版本,你可能会遇到麻烦,因为即使它不是gcc,它也会被true
评估为<
。
我认为如果你检查
,使用两者的原因也是可理解性的问题#if defined(__GNUC__) && (__GNUC>=4)
很明显,你不已经在一个只有GCC代码的块中,而简化
#if (__GNUC__ >= 4)
没有那么明显,只有当你已经知道它是gcc时才可以作为版本检查阅读。
答案 1 :(得分:2)
在GNUC案例中,当你以相反的方式测试它时,它会做错事:
#if (__GNUC__ < 4)
我认为即使没有定义GNUC,这个也是正确的。