我试图定义一个宏,该宏应该接受两个字符串值,并将它们用一个空格连接起来返回。看起来我可以使用除了空格以外的任何字符,例如:
#define conc(str1,str2) #str1 ## #str2
#define space_conc(str1,str2) conc(str1,-) ## #str2
space_conc(idan,oop);
space_conc
将返回"idan-oop"。
我想要一些东西返回"idan oop",有什么建议吗?
我试图定义一个宏,该宏应该接受两个字符串值,并将它们用一个空格连接起来返回。看起来我可以使用除了空格以外的任何字符,例如:
#define conc(str1,str2) #str1 ## #str2
#define space_conc(str1,str2) conc(str1,-) ## #str2
space_conc(idan,oop);
space_conc
将返回"idan-oop"。
我想要一些东西返回"idan oop",有什么建议吗?
试一下这个
#define space_conc(str1,str2) #str1 " " #str2
'##'符号用于连接符号,而不是字符串。在C语言中,字符串可以简单地并置,编译器会将它们连接起来,这就是这个宏的作用。首先将str1和str2转换为字符串(如果像这样使用space_conc(hello, world)
,那么可以假设它们分别是"hello"和"world"),然后用一个简单的、单空格的字符串将它们放在一起。也就是说,最终的展开结果会被编译器解释为:
"hello" " " "world"
它将连接到其中
"hello world"
HTH
编辑
为了完整性,宏扩展中的'##'运算符是这样使用的,假设你有以下代码:
#define dumb_macro(a,b) a ## b
如果被称为dumb_macro(hello, world)
,将会产生以下结果:
helloworld
这里的'helloworld'不是一个字符串,而是一个符号。如果你没有先定义它,你很可能会遇到未定义符号的错误。以下方式是合法的:
int helloworld;
dumb_macro(hello, world) = 3;
printf ("helloworld = %d\n", helloworld); // <-- would print 'helloworld = 3'
#define space_conc(str1, str2) #str1 " " #str2
printf("%s", space_conc(hello, you)); // Will print "hello you"
#define concatenatedstring string1 string2
dumb_macro(mypackage,myfunction)
的操作,则不一定是愚蠢的... - R.. GitHub STOP HELPING ICEdumb_macro(a,b) a ## b
会连结准确的符号,就像你所展示的一样。但是我如何将符号与变量的值连结在一起呢?比如说有一个整数n
,它持有一个值1、2...那么我如何将sym
与变量n的值(而不是n
)连结起来?例如:如果n=1,那么我需要得到sym2
。 - Anubis