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文字来自一个库,我需要将字符串作为状态消息打印出来.
如果您可以使用随附的单引号,则可以使用字符串化:
#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,它是在运行时没有格式化的唯一方式.
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().
| 归档时间: |
|
| 查看次数: |
7717 次 |
| 最近记录: |