我告诉其他人cc -DFOO
与cc -DFOO=1
是一样的,但我不太确定所有编译器是否支持这一点。那么它是C编译器的标准吗?
(受到接受的答案的启发,发现了最近的POSIX c99标准,2016版。仅供参考。)
答案 0 :(得分:4)
它不是C编译器的标准,尽管它是符合POSIX标准的系统的标准。请参阅the cc manual。
答案 1 :(得分:0)
ISO标准仅要求未定义的宏评估为零。因此,虽然使定义值非零是有意义的,但它不是必需的。值为1也可以作为非零值,因为这是转换为整数时的真正布尔表达式的值。
所以虽然它不是标准的'它可能是最可能和最不正确的实现。但是,你不应该真正提倡按价值对这些宏进行明确的测试,因为这样做会表明明显缺乏关注。应仅测试此类宏的定义而不是值。
请注意,如果#if defined FOO
未定义,则FOO
#if 0L
形式的表达式将解析为FOO
;如果定义#if 1L
,则表达式FOO
但这是defined FOO
的评估,并且没有说明FOO
的价值。
如果FOO
已定义但未明确指定值,则以下内容具有明确定义的行为:
#ifdef FOO
#ifndef FOO
#if defined FOO
#if !defined FOO
#if FOO != 0
#if FOO == 0
这可能是不提倡的选择:
#if FOO == 1