是否可以将编译器-D定义字符串值放在变量中?

时间:2017-12-01 11:58:16

标签: c parameters

我有以下代码:

#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值进行打印/存储?

1 个答案:

答案 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"。为避免这种情况,您需要另一个级别的宏扩展。