它是 C 编译器处理“-DFOO”与“-DFOO=1”相同的事实标准吗?
Is it the defacto standard for C compilers to handle "-DFOO" the same as "-DFOO=1"?
我告诉其他人 cc -DFOO
与 cc -DFOO=1
相同,但我不确定是否所有编译器都支持这一点。那么它是 C 编译器的标准吗?
(受已接受答案的启发,找到了最近的 POSIX c99 标准,2016 年版。仅供参考。)
它不是 C 编译器的标准,但它是 POSIX 兼容系统的标准。参见 the cc manual。
ISO 标准只要求未定义的宏的计算结果为零。因此,虽然使定义的值非零是有意义的,但这不是必需的。值 1 作为非零值也有意义,因为它是转换为整数时的真布尔表达式的值。
因此,虽然它不是 'standard',但它可能是最有可能且最不正当的实施方式。但是,您不应该真正提倡按值对此类宏进行显式测试,因为这样做表明明显缺乏关注。此类宏应仅针对定义而不是值进行测试。
请注意,如果 FOO
未定义,#if defined FOO
FOO
形式的表达式将解析为 #if 0L
,如果 FOO
为 FOO
,则解析为 #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
我告诉其他人 cc -DFOO
与 cc -DFOO=1
相同,但我不确定是否所有编译器都支持这一点。那么它是 C 编译器的标准吗?
(受已接受答案的启发,找到了最近的 POSIX c99 标准,2016 年版。仅供参考。)
它不是 C 编译器的标准,但它是 POSIX 兼容系统的标准。参见 the cc manual。
ISO 标准只要求未定义的宏的计算结果为零。因此,虽然使定义的值非零是有意义的,但这不是必需的。值 1 作为非零值也有意义,因为它是转换为整数时的真布尔表达式的值。
因此,虽然它不是 'standard',但它可能是最有可能且最不正当的实施方式。但是,您不应该真正提倡按值对此类宏进行显式测试,因为这样做表明明显缺乏关注。此类宏应仅针对定义而不是值进行测试。
请注意,如果 FOO
未定义,#if defined FOO
FOO
形式的表达式将解析为 #if 0L
,如果 FOO
为 FOO
,则解析为 #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