以下是给定的C文件:
$ cat macros.c
#ifdef MACRO
# error MACRO is defined
#else
# error MACRO is undefined
#endif
#if MACRO
# error MACRO is non-zero
#else
# error MACRO is zero
#endif
以下代码的预期输出是什么?
$ gcc -c macros.c
$ gcc -DMACRO -c macros.c
$ gcc -DMACRO=0 -c macros.c
答案: 这是我的机器上gcc的预处理器所做的事情。
$ gcc -c macros.c
macros.c:4:4: error: #error MACRO is undefined
macros.c:9:4: error: #error MACRO is zero
$ gcc -DMACRO -c macros.c
macros.c:2:4: error: #error MACRO is defined
macros.c:7:4: error: #error MACRO is non-zero
$ gcc -DMACRO=0 -c macros.c
macros.c:2:4: error: #error MACRO is defined
macros.c:9:4: error: #error MACRO is zero
$
课程: #ifdef MACRO
对于已定义的情况下即使定义值为0(零)也会评估为真(true)。这是另一个C预处理器需要注意的地方!这是否符合C标准?
#ifdef
代表“如果定义”。你为什么认为值与此有关呢?也许是来自PHP / Javascript懒惰比较的影响? - Lightness Races in Orbit0
,或fred
或""
或其他任何值,实际上仍然是定义该宏,因此在我看来,如果已经定义了该宏,#ifdef
应该报告该宏已定义-它不关心它的定义值是什么,只要它已经被定义... - twalberg