c++ - 没有空格的宏

标签 c++ c macros printf widechar

我有一个用于调试的宏。

#define diagnostic_arg(message,...) fprintf(stderr,message,__VA_ARGS__)

我发现我需要在我的程序中使用宽字符,所以我想只更改我的宏并让一切正常:

#define diagnostic_arg(message,...) fwprintf(stderr,message,__VA_ARGS__)

但是,我需要宽字符串,通过在字符串的开头引号前放置一个 L 来定义:

#define diagnostic_arg(message,...) fprintf(stderr,Lmessage,__VA_ARGS__)

现在显然,上面的行不起作用。但是,如果我使用 L message,那也行不通。那么我该如何编写 Lmessage 并让它按照我的意愿行事呢?

最佳答案

您可以使用 token pasting operator ## :

#define diagnostic_arg(message,...) fprintf(stderr,L##message,__VA_ARGS__)

但是,最好使用 TEXT 宏(如果您在 Visual Studio 中),无论 UNICODE 是否定义,它都会做正确的事情:

#define diagnostic_arg(message,...) fprintf(stderr,TEXT(message),__VA_ARGS__)

如果不是,TEXT 可以这样定义:

#ifdef UNICODE
#define TEXT(str) L##str
#else
#define TEXT(str) str
#endif

但是,如果您计划使用其他 #define 作为该宏的第一个参数(实际上即使您不打算这样做),您将需要宏中的另一层间接寻址,以便对定义进行评估,而不是将其作为文本与 L 粘贴在一起。请参阅 Mooing Duck 的回答以了解如何执行此操作,他实际上是执行此操作的正确方法,但我不会删除此答案,因为我想保留我的 80 次代表。

关于c++ - 没有空格的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9813026/

相关文章:

c++ - 从 vector C++ 添加 int 元素时出错

c++ - 从相同类型的静态成员进行类内初始化

c++ - 修改unique_ptrs的priority_queue

c - 使用 C 替换文本文件中的行

在 Ubuntu 16.10 上使用 "Error: No available targets are compatible with this triple"将 C 程序编译为 WebAssembly 程序

c++ - 是否应该定义#if 中使用的宏?

c++ - C++ 中未知类型的宏

macros - 检测全局范围的宏

c++ - 将 boost 打包到共享库中

c - 这是编码约定吗?