【问题标题】:gcc macro define option doesn't work for stringgcc 宏定义选项不适用于字符串
【发布时间】:2012-12-25 12:34:33
【问题描述】:

示例代码:

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

【问题讨论】:

  • 它叫做“宏”,而不是“宏”。
  • 如果他愿意,他可以使用一个名为 MARCO 的宏。他也可以有另一个叫 POLO。
  • 啊,有人编辑了标题。

标签: c linux gcc


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你也可以这样使用...

    -DMACRO="\"abcde\""

    参考: How do I pass a quoted string with -D to gcc in cmd.exe?

    【讨论】:

    • 您也可以只使用-DMACRO=\"abcde\" 并获得相同的效果。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-22
      • 1970-01-01
      相关资源
      最近更新 更多