没有空格的宏
Macro Without Space
本文关键字:空格 更新时间:2023-10-16
我有一个用于调试的宏。
#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
并让它做我想做的事情呢?
您可以使用标记粘贴运算符##
:
#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代表。
我隐约记得答案是类似的东西
//glues two symbols together that can't be together
#define glue2(x,y) x##y
#define glue(x,y) glue2(x,y)
//widens a string literal
#define widen(x) glue(L,x)
#define diagnostic_arg(message,...) fprintf(stderr,widen(message),__VA_ARGS__)
Glue有时需要两个宏(如我所示),因为我不太理解的奇怪原因,在C++faq 上解释了这一点
相关文章:
- 2D数组来自文本输入,中间有空格
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 如何在C++中读取空格分隔的输入 当我们不知道输入的数量时
- 如何在c++中使用system()来运行包含空格的python脚本
- basic_string的前导/尾部不区分空格的特征
- 移除前面有空格的前2个字符串
- 如何将以逗号和空格分隔的整数读取到 2D 数组中?
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- 如何逐行读取文件,每行中的内容都用空格分隔并将其写入新文件中
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 用于存储由空格分隔的字符串的 C++/C 数据结构
- 在字符串中插入空格
- C ++中的StringStream有助于使用向量从字符串中提取逗号分隔的整数,而不是空格分隔的整数,为什么?
- C++为一串单词添加空格
- 使用另一个字符串从字符串中删除空格
- 我还可以添加什么来按空格或空格正确拆分C++字符串?
- 如何打印不带空格的输入整数?
- 野牛/yacc 解析器在不被空格分隔时跳过 grammer - "unexpected $end"
- C++ "noskipws"没有按预期工作,如何正确允许字符串中的空格?
- 在 c++ 中逐行阅读字符串,不要以空格停止