C 语言中用于连接两个字符串的宏定义

22

我试图定义一个宏,该宏应该接受两个字符串值,并将它们用一个空格连接起来返回。看起来我可以使用除了空格以外的任何字符,例如:

#define conc(str1,str2) #str1 ## #str2 
#define space_conc(str1,str2) conc(str1,-) ## #str2

space_conc(idan,oop);

space_conc将返回"idan-oop"。

我想要一些东西返回"idan oop",有什么建议吗?

3个回答

49

试一下这个

#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'

2
请记住,如果您正在执行类似于 dumb_macro(mypackage,myfunction) 的操作,则不一定是愚蠢的... - R.. GitHub STOP HELPING ICE
@R.,当然这个概念有其用途,但通常与其他语义值相关联,或者具有替换宏为其他内容的选项(例如,用于调试目的)。我不想深入探讨任何类似的内容,所以这个特定的宏只是一个愚蠢的宏,将两个符号名称连接在一起,没有任何实际用途... :) - falstro
哇,这是一个非常好的答案。想知道如何进行符号串联。这真的很有用。 - Anubis
@roe 我有一个问题要问。dumb_macro(a,b) a ## b会连结准确的符号,就像你所展示的一样。但是我如何将符号与变量的值连结在一起呢?比如说有一个整数n,它持有一个值1、2...那么我如何将sym变量n的值(而不是n)连结起来?例如:如果n=1,那么我需要得到sym2 - Anubis
@Anubis; 由于预处理规范中的一些怪癖,它只会递归地评估那些不是连接或字符串的标记,因此您需要一个间接层。快速谷歌搜索给出了这两个示例,我希望它们能帮助您,祝您好运! - falstro

5
#define space_conc(str1, str2) #str1 " " #str2
printf("%s", space_conc(hello, you)); // Will print "hello you"

1
正确的方法是将两个字符串并排放置。使用'##'不起作用。只需要:
#define concatenatedstring string1 string2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接