示例代码:
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
选项是否仅支持整数?
答案 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)