使用宏来连接

时间:2014-03-14 09:08:04

标签: c c-preprocessor

抱歉,我错过了分号,我现在已经添加了。

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

编译时我得到了以下错误 main.c:在函数'main'中: main.c:8:1:错误:'helloworld'未声明(首次使用此函数) main.c:8:1:注意:每个未声明的标识符仅针对它出现在

中的每个函数报告一次

但是

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

完美运作并给出答案为12

5 个答案:

答案 0 :(得分:1)

你必须记住,预处理器完全取代了宏调用。所以在你的情况下宏调用

m(hello,world)

变为

(helloworld)

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

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

答案 1 :(得分:0)

应用宏后,您就可以了:

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

编译器说,helloworld是什么?

答案 2 :(得分:0)

检查出来

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

答案 3 :(得分:0)

当你使用宏连接hello和world时,你并没有真正创建一个char *或char [], 但是一个符号。

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

int helloworld;

然后

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

答案 4 :(得分:0)

只需将字符串放在一起,就可以连接字符串。

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

或只是

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