C-Preprocessor:将字符组合成一个字符串

时间:2014-10-02 13:56:47

标签: c c-preprocessor

我有一个字符定义列表,如下所示:

#define MYCHAR_1 0xC3
#define MYCHAR_2 0xB6

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

是否可以创建一个带前缀的宏(在本例中为“MYCHAR”)并生成字符串“\ xC3 \ xB6”? (即“ö”)

换句话说,C预处理器可以用静态数组元素创建静态字符串(或数组)吗?

最终结果应该可以由具有字符串作为参数的函数使用,例如:

printf(MY_MAGIC_MACRO(MYCHAR));

应打印“ö”。

2 个答案:

答案 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;