这是C编译器处理" -DFOO"的事实标准吗?和#34; -DFOO = 1"?

时间:2015-04-01 06:19:21

标签: c compilation c-preprocessor

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

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

2 个答案:

答案 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