我想要连接一个字符串文字和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文字来自一个库,我需要将字符串作为状态信息打印出来。
答案 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;
}
答案 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()
。