我有一个字符定义列表,如下所示:
#define MYCHAR_1 0xC3
#define MYCHAR_2 0xB6
(这是形成UTF-8字符“ö”的两个字节)
是否可以创建一个带前缀的宏(在本例中为“MYCHAR”)并生成字符串“\ xC3 \ xB6”? (即“ö”)
换句话说,C预处理器可以用静态数组元素创建静态字符串(或数组)吗?
最终结果应该可以由具有字符串作为参数的函数使用,例如:
printf(MY_MAGIC_MACRO(MYCHAR));
应打印“ö”。
答案 0 :(得分:2)
如图所示的数字定义,它是适度的。但是,假设您有一个C99或更高版本的编译器,您可以使用复合文字:
#define MYCHAR_1 0xC3
#define MYCHAR_2 0xB6
printf("%s", (char []){ MYCHAR_1, MYCHAR_2, '\0' });
如果您坚持使用C89,那么除了定义数组变量并将其传递给函数之外,您可能没有任何其他好的选择。
如果你想让一个MY_MAGIC_MACRO(MYCHAR)工作,你必须知道有多少个名字(在这个例子中每个前缀2个):
#define MY_MAGIC_MACRO(x) ((char []){ x##_1, x##_2, '\0' })
printf("%s\n", MY_MAGIC_MACRO(MYCHAR));
#include <stdio.h>
#define MYCHAR_1 0xC3
#define MYCHAR_2 0xB6
#define MY_MAGIC_MACRO(x) ((char []){ x##_1, x##_2, '\0' })
int main(void)
{
printf("%s\n", (char[]){ MYCHAR_1, MYCHAR_2, '\0' });
printf("%s\n", MY_MAGIC_MACRO(MYCHAR));
return 0;
}
UTF-8终端上的输出在不同的行上为ö
两次。
答案 1 :(得分:1)
我能想出的最接近你想达到的目标:
#define MYCHAR_1 "\xC3"
#define MYCHAR_2 "\xB6"
const char STR [] = "ABC" MYCHAR_1 "DEF" MYCHAR_2;