将字符串文字与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; }
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()
。