【发布时间】:2019-11-19 23:57:54
【问题描述】:
在编译时提供定义时,如何检查是否定义了宏。
我有 Makefile,它在编译示例 C 文件时解析并传递此字符串 ("-DMACRO_TEST=${DEFINED}")。
变量 DEFINED 可能有也可能没有值(0 或非零)。
当变量 DEFINED 本身没有任何值时,我想知道如何检查 MACRO_TEST 是否已定义。这类似于编译 C 文件时传递“-DMACRO_TEST=”。
#include <stdio.h>
#ifdef MACRO_TEST
char msg[] = "MACRO_TEST is defined";
#else
char msg[] = "MACRO_TEST is NOT-defined";
#endif
int main ()
{
printf("msg = %s\n", msg);
return 0;
}
命令行输出
$ gcc tmp.c -DMACRO_TEST=0
$ ./a.out
msg = MACRO_TEST is defined
$ gcc tmp.c -DMACRO_TEST=
$ ./a.out
msg = MACRO_TEST is defined
在第二种情况下编译时,我期待它会返回
msg = MACRO_TEST is NOT-defined
【问题讨论】:
-
它已定义,但值为“empty”,因为 make 用空替换任何缺失的变量。实际上,我不确定编译器是否会将其定义为空,或者在没有赋值时将其定义为默认值 1。您可以使用表达式
MACRO_TEST+0在 C 代码中探索这一点 -
有一个重复的问题询问如何区分宏何时未设置、为空、为零或其他任何内容。但我找不到它。
-
@GemTaylor,它对我有用。但是,在我累之前,我认为它会给出编译时错误,因为
+op 需要 2 个参数并且当 MACRO_TEST 设置为“空”时。这将如何运作。
标签: c gcc c-preprocessor