C 预处理器:将字符组合成字符串

标签 c c-preprocessor

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

#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/

相关文章:

c - Visual C++ 将 C 文件作为 C 处理

c++ - 来自文字的静态 std::string 对象的宏

c - C 预处理器是先删除注释还是先扩展宏?

c - 使用宏初始化特定数组元素

c - 如何通过分段或分页防止缓冲区溢出?

c - 写入通过结构传递给线程的 mmap 输出 (C)

c - 我正在尝试解释这个 IA32 汇编语言代码

c - OpenCV,cvCvtColor : null array pointer is passed in function cvgetmat

c - 如何在 C 预处理器中使用复杂的控制流、算术或函数原语?

c - 这个 "#define CONCAT_3(p1, p2, p3) p1##p2##p3"宏定义是什么意思?