2014-10-02 58 views
2

我的字符定义的列表,这样的:C-预处理:联合字符到一个字符串

#define MYCHAR_1 0xC3 
#define MYCHAR_2 0xB6 

(这些是形成UTF-8字符的两个字节“O”)

是否有可能创建了一个宏以前缀(本例中“MYCHAR”),并产生字符串“\ XC3 \ XB6”? (即,“O”)

换言之能够在C-预处理器创建的静态字符串(或阵列)进行静态数组元素的?

printf(MY_MAGIC_MACRO(MYCHAR)); 

应打印“ö”:

最终结果应当由具有一个字符串作为参数,例如一个功能是可用的。

+2

*您当然可以做到*'字符ouml [] = {MYCHAR_1,MYCHAR_2,0};' – 2014-10-02 14:01:51

+0

OK,但我该如何使用,在功能? - 我对这个问题进行了澄清。 (顺便说一句,你就需要为无符号UTF-8字符) – 2014-10-02 14:19:12

+0

您不必使用'无符号char'为UTF-8字符;任一'签署char'或纯'char'也是正确的,可使用的,等等。然而,在除了标准库的支持,所有方面'无符号char'将比一个可能(或绝对)更容易签署'char'表示。 – 2014-10-02 14:41:31

回答

2

随着数字定义如图所示,这是硬度适中。但是,假设你有一个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终端在单独的线路上是ö两次。

1

最接近的事你要做到这一点,我可以想出什么:

#define MYCHAR_1 "\xC3" 
#define MYCHAR_2 "\xB6" 

const char STR [] = "ABC" MYCHAR_1 "DEF" MYCHAR_2;