2

示例代码:

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选项是否只支持整数?

4

3 回答 3

16

问题是双引号被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你会发现它产生了正确的答案。

于 2012-12-25T12:37:45.240 回答
2

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

于 2012-12-25T12:37:29.263 回答
2

你也可以这样使用...

-DMACRO="\"abcde\""

参考: 如何在 cmd.exe 中将带有 -D 的带引号的字符串传递给 gcc?

于 2012-12-25T12:37:30.873 回答