我有一个用于调试的宏。
#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/