【问题标题】:Using macro to concatenate使用宏连接
【发布时间】:2014-04-19 11:24:27
【问题描述】:

对不起,我错过了分号,我现在添加了。

#include <stdio.h>
#define m(i,j) (i##j)
int main(){
m(hello,world);
return 0;
}

编译时出现以下错误 main.c:在函数“main”中: main.c:8:1: error: ‘helloworld’ undeclared (第一次在这个函数中使用) main.c:8:1: 注意:每个未声明的标识符对于它出现的每个函数只报告一次

但是

#include <stdio.h>
#define m(i,j) (i##j)
int main(){
m(1,2);
return 0;
}

完美运行,答案为 12

【问题讨论】:

  • "给出答案为 12" 怎么样?你没有输出它。
  • 需要字符串文字吗?

标签: c c-preprocessor


【解决方案1】:

您必须记住,预处理器完全按照字面意思替换了宏调用。所以在你的情况下宏调用

m(hello,world)

变成

(helloworld)

这不是 C 中的有效语句或表达式。您询问的错误是因为编译器不知道 helloworld 是什么,但由于缺少分号,应该还有其他错误。

另一个示例,其中m(1,2) 至少替换为(12) 更有效,因为没有未声明的标识符。但它仍然缺少一个分号。

【讨论】:

  • 感谢您的帮助:)
【解决方案2】:

应用你的宏后,你会得到这个:

#include <stdio.h>
int main(){
(helloworld)
return 0;
}

编译器在说,helloworld 是什么?

【讨论】:

  • 感谢您的帮助:)
  • @PuneethSrinivas 不用感谢别人,只需点击 0 上方的点赞箭头即可。
【解决方案3】:

看看这个

#include <stdio.h>
#define m(i,j) (i##j)
int main(){
m('hello','world')
return 0;
}

【讨论】:

    【解决方案4】:

    当您使用宏连接 hello 和 world 时,您并没有真正创建 char* 或 char[], 只是一个象征。

    因为之前代码中没有定义符号helloworld,你当然会得到一个未定义的错误。 要解决这样的问题,您可以简单地将符号定义为 int 或任何其他原语,并将其声明放在宏之前:

    int helloworld;
    

    然后

    m(hello,world) = 10;
    printf ("%d", helloworld);
    

    【讨论】:

    • 感谢您的帮助:)
    【解决方案5】:

    您可以通过将字符串彼此相邻放置来连接字符串。

    #include <stdio.h>
    #define m(i,j) (i j)
    int main(){
    m("hello","world");
    return 0;
    }
    

    或者只是

    int main(){
    "hello" "world";
    return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      • 2015-02-03
      • 2018-11-29
      • 1970-01-01
      相关资源
      最近更新 更多