将字符串文字与char文字连接起来

时间:2012-03-28 16:54:21

标签: c string macros char concatenation

我想要连接一个字符串文字和char文字。语法错误,"abc" 'd' "efg"呈现编译器错误:

  

x.c:4:24:错误:预期','或';'在'd'之前

到现在为止,我必须使用snprift(不必要),尽管字符串文字的值和编译时知道的char文字。

我试过

#define CONCAT(S,C) ({ \
    static const char *_r = { (S), (C) }; \
    _r; \
})

但它不起作用,因为S的空终止符未被删除。 (除了给出编译器警告。)

有没有办法编写宏来使用

  • "abc" MACRO('d') "efg"
  • MACRO1(MACRO2("abc", 'd'), "efg")
  • MACRO("abc", 'd', "efg")

如果有人问我为什么要这样:char文字来自一个库,我需要将字符串作为状态信息打印出来。

4 个答案:

答案 0 :(得分:6)

如果您可以使用其中包含的单引号,则可以使用字符串化:

#define SOME_DEF 'x'

#define STR1(z) #z
#define STR(z) STR1(z)
#define JOIN(a,b,c) a STR(b) c

int main(void)
{
  const char *msg = JOIN("Something to do with ", SOME_DEF, "...");

  puts(msg);

  return 0;
}

取决于可能适合或不适合的上下文,但只要说服它实际上是一个字符串文字buitl,这是在没有格式化运行时想到的唯一方法。

答案 1 :(得分:3)

试试这个。它使用双宏的C宏技巧,因此宏参数在字符串化之前有机会展开。

#include <stdio.h>

#define C d
#define S "This is a string that contains the character "
#define STR(s) #s
#define XSTR(s) STR(s)

const char* str = S XSTR(C);

int main()
{
    puts(str);
    return 0;
}

答案 2 :(得分:3)

我想出了一个我不太喜欢的特定于GCC的解决方案,因为人们无法嵌套使用CONCAT

#include <stdio.h>

#define CONCAT(S1,C,S2) ({                        \
    static const struct __attribute__((packed)) { \
        char s1[sizeof(S1) - 1];                  \
        char c;                                   \
        char s2[sizeof(S2)];                      \
    } _r = { (S1), (C), (S2) };                   \
    (const char *) &_r;                           \
})

int main(void) {
    puts(CONCAT ("abc", 'd', "efg"));
    return 0;
}

http://ideone.com/lzEAn

答案 3 :(得分:2)

C只会让你连接字符串文字。实际上,snprintf()并没有错。您也可以使用strcpy()

strcpy(dest, str1);
dest[strlen(dest)] = c;
strcpy(dest + strlen(dest) + 1, str2);

您还可以使用巨型switch语句来克服此限制:

switch(c) {
    case 'a':
        puts("part1" "a" "part2");
        break;
    case 'b':
        puts("part1" "b" "part2");
        break;

    /* ... */

    case 'z':
        puts("part1" "z" "part2");
        break;
}

......但我拒绝主张任何作者身份。

简而言之,只需坚持使用snprintf()