2014-03-14 56 views
0

对不起,我错过了分号,现在我已经添加了。使用宏连接

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

虽然编译我得到以下错误 main.c中:在函数 '主': main.c中:8:1:错误: '的HelloWorld' 未声明(第一在此函数使用) 主.C:8:1:注:每个未声明的标识符报道只有一次出现在

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

作品完美的每个功能,并给答案12

+0

“给出的答案是12” 怎么样?你不输出它。 – weston

+0

它需要一个字符串文字吗? – BLUEPIXY

回答

0

宏被施加后,你只得到这样的:

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

并且编译器会说,什么是helloworld

+0

感谢您的帮助:) –

+1

@PuneethSrinivas不要感谢人们,只需点击上面的upvote箭头0. – weston

1

您必须记住预处理器完全替换宏调用。所以你的情况宏调用

m(hello,world) 

成为

(helloworld) 

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

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

+0

感谢您的帮助:) –

0

检查了这一点

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

当你级联都打招呼,世界,使用宏,你并没有真正创造一个char *或烧焦[], 而是一个象征。

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

int helloworld; 

然后

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

谢谢你的帮助:) –

0

你可以只需将它们放在一起即可串联字符串。

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

或只是

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