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

kay*_*kay 10 c string macros concatenation char

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

xc:4:24:错误:预期','或';' 在'd'之前

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

我试过了

#define CONCAT(S,C) ({ \
    static const char *_r = { (S), (C) }; \
    _r; \
})
Run Code Online (Sandbox Code Playgroud)

但它不起作用,因为S没有剥离null终止符.(除了给出编译器警告.)

有没有办法编写一个宏来使用

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

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

Fat*_*ror 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;
}
Run Code Online (Sandbox Code Playgroud)

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


Phi*_*lip 2

C 只允许您连接字符串文字。其实,并没有什么不妥snprintf()。您还可以使用strcpy()

strcpy(dest, str1);
dest[strlen(dest)] = c;
strcpy(dest + strlen(dest) + 1, str2);
Run Code Online (Sandbox Code Playgroud)

您还可以使用一个巨大的switch语句来克服这个限制:

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

    /* ... */

    case 'z':
        puts("part1" "z" "part2");
        break;
}
Run Code Online (Sandbox Code Playgroud)

...但我拒绝声称任何作者身份。

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