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

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

xc: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文字来自一个库,我需要将字符串作为状态消息打印出来。

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

 #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,它是在运行时没有格式化的唯一方式。

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

 #include  #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; } 

我提出了一个我不太喜欢的GCC特定解决方案,因为不能嵌套使用CONCAT

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

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()