gcc宏定义选项不适用于字符串

时间:2012-12-25 12:34:33

标签: c linux gcc

示例代码:

main()
{
    printf("%d\n", MARCO);  
//  printf("%s\n", MARCO);
}

当我尝试使用gcc -D选项时,我发现以下命令有效:

gcc -D MARCO=12345 test.c

但是当我将12345更改为字符串时:

gcc -D MARCO=abcde test.c

发生错误:

error: ‘abcde’ undeclared (first use in this function)

我尝过-DMARCO=abcde-DMARCO="abcde"-D MARCO="abcde";所有这一切都失败了。

这个-D选项是否仅支持整数?

3 个答案:

答案 0 :(得分:15)

问题是shell会识别双引号并将其删除,除非您通过转义双引号(使用反斜杠)或将它们用单引号括起来阻止shell执行此操作(这是我使用的):

gcc -DMARCO='"abcde"' test.c

单引号被shell剥离,但这意味着C预处理器可以看到双引号。当然,您需要使用%s格式。

通过更改宏,您可以在命令行上对非引用名称进行字符串化:

#include <stdio.h>
#define STRINGIFY(x) #x
#define MACRO(x)     STRINGIFY(x)
int main(void)
{
    printf("%s\n", MACRO(MARCO));
    return(0);
}

使用gcc -o testprog -DMARCO=abcde test.c进行编译,您会发现它会产生正确的答案。

答案 1 :(得分:2)

MARCO实际上被您输入的字符串取代,然后才编译代码。由于字符串周围没有引号(两个示例中的双引号被shell解释为分隔符),abcde不会被解释为字符串,而是作为标识符。由于未定义,代码无法编译。

答案 2 :(得分:1)

你也可以这样使用......

-DMACRO="\"abcde\""

<强>价: How do I pass a quoted string with -D to gcc in cmd.exe?