2013-12-07 56 views
7

添加零,而希望通过一些C头文件(特别是stdarg.h),我注意到一个非常奇特的线路:在C预处理语句

#if !defined(__STRICT_ANSI__) || __STDC_VERSION__ + 0 >= 199900L 

奇怪的部份是+ 0。零是附加标识;它是写作noop的各种数学之一。

在上述预处理器语句中添加零有什么作用?我知道那里有all sorts of weird preprocessor magic,但这看起来很荒谬。

回答

12

如果将__STDC_VERSION__定义为 空标记(例如#define __STDC_VERSION__),则可避免预处理器语法错误。

(感谢Jens Gustedt指出我答案的第一个版本是错误的。)

+1

不完全正确。预处理器评估的规则将未知的标识符标记评估为0,所以如果没有定义它就没有问题。这个问题的关键在于什么时候会被定义,而不是空的标记。 –

+0

@JensGustedt:你是对的,我只是试图在一些测试代码中验证我的答案,并注意到它不正确。我希望现在是正确的。 –

+0

扭曲。如果令牌为空白,我想+符号只是被解释为一元运算符。 – ApproachingDarknessFish