C预处理器宏 - 定义与价值可携带性和实践

Bre*_*ale 5 gcc c-preprocessor

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

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

这是我通常使用的预处理器测试 - 不仅仅是__GNUC__,但它是一个常见的例子.或者,

#if (__GNUC__ >= 4)

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

Joa*_*son 6

预处理器假定未定义的宏0在比较中具有值,因此在这种情况下您的简化是正确的.如果你想核对比GCC 4更低的版本,你可能会惹上麻烦,虽然,因为这将作为评估true<,即使它不是GCC.

如果你检查,我认为使用两者的原因也是可理解性的问题

#if defined(__GNUC__) && (__GNUC>=4)
Run Code Online (Sandbox Code Playgroud)

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

#if (__GNUC__ >= 4)
Run Code Online (Sandbox Code Playgroud)

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