对于特定编译器代码,常见的cpp指令如下:
#if defined (__GNUC__) && (__GNUC__ >= 4)
这是我通常使用的预处理器测试 - 不仅限于__GNUC__
,但这是一个常见的例子。另外,
#if (__GNUC__ >= 4)
似乎也能满足同样的要求。后一种方法是否存在潜在问题?不仅适用于gcc,还适用于符合标准的任何预处理器。即使未定义,左侧是否会被评估为某个值?是否有任何语言专家注意到第二种方法的任何陷阱?
对于特定编译器代码,常见的cpp指令如下:
#if defined (__GNUC__) && (__GNUC__ >= 4)
这是我通常使用的预处理器测试 - 不仅限于__GNUC__
,但这是一个常见的例子。另外,
#if (__GNUC__ >= 4)
似乎也能满足同样的要求。后一种方法是否存在潜在问题?不仅适用于gcc,还适用于符合标准的任何预处理器。即使未定义,左侧是否会被评估为某个值?是否有任何语言专家注意到第二种方法的任何陷阱?
预处理器假定未定义的宏在比较中的值为0
,所以在这种情况下您的简化是可以的。如果您想要针对低于 gcc 4 的版本进行检查,则可能会遇到问题,因为使用 <
比较时即使不是 gcc,它也会计算为true
。
我认为同时使用两者的原因也与可理解性有关,如果您检查
#if defined(__GNUC__) && (__GNUC>=4)
很明显,您并没有在只适用于GCC的代码块中,而简化代码如下:
#if (__GNUC__ >= 4)
这并不明显,只有当你已经知道它是gcc时,才能将其视为版本检查。
#if (__GNUC__ < 4)