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

Don*_*all 2 c linux gcc

示例代码:

main()
{
    printf("%d\n", MARCO);  
//  printf("%s\n", MARCO);
}
Run Code Online (Sandbox Code Playgroud)

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

gcc -D MARCO=12345 test.c
Run Code Online (Sandbox Code Playgroud)

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

gcc -D MARCO=abcde test.c
Run Code Online (Sandbox Code Playgroud)

发生错误:

error: ‘abcde’ undeclared (first use in this function)
Run Code Online (Sandbox Code Playgroud)

我已经试过-DMARCO=abcde,-DMARCO="abcde",-D MARCO="abcde",所有这一切都失败了.

-D选项仅支持整数吗?

Jon*_*ler 15

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

gcc -DMARCO='"abcde"' test.c
Run Code Online (Sandbox Code Playgroud)

单引号被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);
}
Run Code Online (Sandbox Code Playgroud)

编译它,gcc -o testprog -DMARCO=abcde test.c你会发现它产生正确的答案.