C-预处理:联合字符到一个字符串
问题描述:
我的字符定义的列表,这样的:C-预处理:联合字符到一个字符串
#define MYCHAR_1 0xC3
#define MYCHAR_2 0xB6
(这些是形成UTF-8字符的两个字节“O”)
是否有可能创建了一个宏以前缀(本例中“MYCHAR”),并产生字符串“\ XC3 \ XB6”? (即,“O”)
换言之能够在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)的工作,那么你必须知道有(每个前缀,在这个例子中)有多少名:
#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终端在单独的线路上是ö
两次。
答
最接近的事你要做到这一点,我可以想出什么:
#define MYCHAR_1 "\xC3"
#define MYCHAR_2 "\xB6"
const char STR [] = "ABC" MYCHAR_1 "DEF" MYCHAR_2;
*您当然可以做到*'字符ouml [] = {MYCHAR_1,MYCHAR_2,0};' – 2014-10-02 14:01:51
OK,但我该如何使用,在功能? - 我对这个问题进行了澄清。 (顺便说一句,你就需要为无符号UTF-8字符) – 2014-10-02 14:19:12
您不必使用'无符号char'为UTF-8字符;任一'签署char'或纯'char'也是正确的,可使用的,等等。然而,在除了标准库的支持,所有方面'无符号char'将比一个可能(或绝对)更容易签署'char'表示。 – 2014-10-02 14:41:31