【发布时间】:2014-01-23 15:32:54
【问题描述】:
给定下面的 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(零)。
另一个 C 预处理器陷阱!这是按照 C 标准应该是这样的吗?
【问题讨论】:
-
我认为差异特别“微妙”,也不是任何形式的“陷阱”。这对我来说似乎相当清晰和直观。
#ifdef代表“如果已定义”。为什么你认为那里的价值与它有任何关系?也许来自 PHP/Javascript 的惰性比较? -
将宏定义为具有
0或fred或""或其他任何值,实际上仍在定义该宏,因此在我看来#ifdef应该报告宏已定义(如果已定义) - 它不关心定义的值是什么,只关心它已定义... -
您的问题可以通过阅读标准来回答;你为什么要让其他人为你读它?
标签: c macros c-preprocessor