我有以下代码:
#include <stdio.h>
#ifdef COMP_DEF
static const char * x = COMP_DEF;
#else
static const char * x = "NULL";
#endif
int main(int argc, char ** argv)
{
printf("%s\n", x);
return 0;
}
我想要的是用两种方式编译这个程序。首先使用编译器参数:
-DCOMP_DEF=FOO_BAR
没有这个的第二种方式。我希望,我的程序会打印FOO_BAR和NULL。 但是当我尝试编译时,我得到以下错误:
:0:10:错误:'FOO_BAR'未声明在这里
(不是在函数中)main.c:5:25:注意:在扩展宏时 'COMP_DEF'静态const char * x = COMP_DEF;
是否可以在变量编译器中传递macrodefine值进行打印/存储?
答案 0 :(得分:4)
您应该尝试这种通常称为 stringification 的常用技巧:
#define STR_IMPL(x) #x
#define STR(x) STR_IMPL(x)
#ifdef COMP_DEF
static const char * x = STR(COMP_DEF);
#else
static const char * x = "NULL";
#endif
#
后跟宏中的参数名称扩展为包含传递参数的字符串文字。如果你这样做
#define STR(x) #x
这会使STR(COMP_DEF)
扩展为"COMP_DEF"
。为避免这种情况,您需要另一个级别的宏扩展。