它是 C 编译器处理“-DFOO”与“-DFOO=1”相同的事实标准吗?

Is it the defacto standard for C compilers to handle "-DFOO" the same as "-DFOO=1"?

我告诉其他人 cc -DFOOcc -DFOO=1 相同,但我不确定是否所有编译器都支持这一点。那么它是 C 编译器的标准吗?

(受已接受答案的启发,找到了最近的 POSIX c99 标准,2016 年版。仅供参考。)

它不是 C 编译器的标准,但它是 POSIX 兼容系统的标准。参见 the cc manual

ISO 标准只要求未定义的宏的计算结果为零。因此,虽然使定义的值非零是有意义的,但这不是必需的。值 1 作为非零值也有意义,因为它是转换为整数时的真布尔表达式的值。

因此,虽然它不是 'standard',但它可能是最有可能且最不正当的实施方式。但是,您不应该真正提倡按值对此类宏进行显式测试,因为这样做表明明显缺乏关注。此类宏应仅针对定义而不是值进行测试。


请注意,如果 FOO 未定义,#if defined FOO FOO 形式的表达式将解析为 #if 0L,如果 FOOFOO,则解析为 #if 1L已定义,但这是对 defined FOO 的评估,并没有说明 FOO.

的值

FOO 已定义但未明确分配值的情况下,以下具有明确定义的行为:

#ifdef FOO
#ifndef FOO
#if defined FOO
#if !defined FOO
#if FOO != 0
#if FOO == 0

这可能是足够的选择不提倡:

#if FOO == 1