代码之家  ›  专栏  ›  技术社区  ›  Idan

用于在C中连接两个字符串的宏

  •  21
  • Idan  · 技术社区  · 16 年前

    我试图定义一个宏,它假定取两个字符串值,并返回它们之间用一个空格连接的值。我似乎可以使用除空格之外的任何字符,例如:

    #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 回复  |  直到 10 年前
        1
  •  48
  •   falstro    16 年前

    试试这个

    #define space_conc(str1,str2) #str1 " " #str2
    

    “”用于连接符号,而不是字符串。字符串可以简单地在C中并置,编译器将它们连接起来,这就是这个宏所做的。首先把str1和str2变成字符串 space_conc(hello, world) )把它们放在一起,用简单的,单一的空间,串在中间。也就是说,结果的扩展将由编译器这样解释

    "hello" " " "world"
    

    它将连接到

    "hello world"
    

    高温高压

    编辑
    为了完整性起见,宏扩展中的“”运算符使用如下,假设您有

    #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
  •  5
  •   Andreas Bonini    16 年前
    #define space_conc(str1, str2) #str1 " " #str2
    printf("%s", space_conc(hello, you)); // Will print "hello you"
    
        3
  •  0
  •   Michael Haephrati    10 年前

    正确的做法是将两条弦一条接一条地放在一起。##“不行。只是:

    #define concatenatedstring string1 string2