下面给出C文件:的#ifdef和之间的#if用于宏定义为微妙差异0
$ 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 -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(零)。
另一个C预处理器gotcha!这是应该如何按照C标准?
我争辩说,区别是特别“微妙”,也没有任何形式的“陷阱”。这对我来说似乎相当清楚和直观。 '#ifdef'代表“if defined”。你为什么认为这个价值与它有什么关系?也许来自PHP/Javascript惰性比较? –
定义一个具有值'0',或'fred'或'“”'或其他任何东西的宏,实际上仍然定义了这个宏,因此我认为'#ifdef'应该报告宏是定义它是否已被定义 - 它并不在意它定义的值是什么,只是它已被定义... – twalberg
你可以通过阅读标准来回答你的问题;你为什么要求其他人为你阅读? –