C 使用宏连接

C 使用宏连接,c,c-preprocessor,C,C Preprocessor,对不起,我漏掉了分号,我现在已经加了 #include <stdio.h> #define m(i,j) (i##j) int main(){ m(hello,world); return 0; } #包括 #定义m(i,j)(i##j) int main(){ m(你好,世界); 返回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(hello,world);
return 0;
}
#包括
#定义m(i,j)(i##j)
int main(){
m(你好,世界);
返回0;
}
编译时出现以下错误 main.c:在函数“main”中: main.c:8:1:错误:“helloworld”未声明(此函数首次使用) main.c:8:1:注意:每个未声明的标识符对于它出现在其中的每个函数只报告一次

但是

#包括
#定义m(i,j)(i##j)
int main(){
m(1,2);
返回0;
}

工作完美,答案为12

您必须记住,预处理器完全取代了宏调用。在您的例子中,宏调用

m(hello,world)
变成

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


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

应用宏后,您只需得到以下结果:

#include <stdio.h>
int main(){
(helloworld)
return 0;
}
#包括
int main(){
(helloworld)
返回0;
}
编译器会说,什么是helloworld?

看看这个

#include <stdio.h>
#define m(i,j) (i##j)
int main(){
m('hello','world')
return 0;
}
#包括
#定义m(i,j)(i##j)
int main(){
m(‘你好’,‘世界’)
返回0;
}

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

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

int helloworld;
然后

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

只需将字符串相邻放置,就可以连接字符串

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

回答为12“如何?您没有输出它。它需要字符串文字?谢谢帮助:)谢谢帮助:)@PuneethSrinivas不要费心感谢别人,只需单击0上方的向上投票箭头。谢谢帮助:)
#include <stdio.h>
#define m(i,j) (i j)
int main(){
m("hello","world");
return 0;
}
int main(){
"hello" "world";
return 0;
}