我有一个字符定义列表,如下所示:
#define MYCHAR_1 0xC3
#define MYCHAR_2 0xB6
(这是构成 UTF-8 字符“ö”的两个字节)
是否可以创建一个采用前缀(在本例中为“MYCHAR”)并生成字符串“\xC3\xB6”的宏? (即“ö”)
换句话说,C 语言预处理器可以用静态数组元素创建静态字符串(或数组)吗?
最终结果应该可供以字符串作为参数的函数使用,例如:
printf(MY_MAGIC_MACRO(MYCHAR));
应该打印“ö”。
最佳答案
使用如图所示的数字定义,它的难度适中。但是,假设您有 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 终端上的输出是ö
,分行两次。
关于C 预处理器:将字符组合成字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26162439/