示例代码:
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
你会发现它产生正确的答案.