在c++ 11中对文本块进行字符串化

Stringifying a block of text in C++11

本文关键字:字符串 文本 c++      更新时间:2023-10-16

在我正在工作的代码中有宏

#define STRINGIFY(...) #__VA_ARGS__
定义

.

这样做的缺点是忽略换行符。

因此,我想定义一个使用新的R"literal( ... )literal"格式的宏。

考虑到宏形式已经存在,我想保留使用STRINGIFY

然而,考虑到有引号涉及,你将如何定义STRINGIFY使用新的字符串文字格式?

也有保存#ifdef s在STRINGIFY宏?

编辑我想要一个定义将转换成R"literal(...)literal"在c++ 11

Edit2 我能得到的最接近的是:

#define STRINGIFY1(a) #a 
#define STRINGIFY(str) R STRINGIFY1(lit(str)lit) 

这将所有正确的东西放在正确的位置,并将块压缩成一行。我开始认为宏不能在这里使用

这不是你想要的,但作为@R。Martinho Fernandes建议您可以使用原始文字:

const char *ptr = R"(
text
here
)"

不可能按照您想要的方式保留换行符,因为stringise操作符显式地丢弃了它们。在之前的任何翻译阶段都无法访问它们,在之后的翻译阶段也无法恢复它们。

(cpp。stringize]¶2[…参数的预处理标记之间每次出现空格都会在字符串字面值中变成一个空格字符。删除第一个预处理令牌之前和包含参数的最后一个预处理令牌之后的空白。[…]

您可能能够编写一个constexpr函数,通过根据一些启发式方法发明换行符来构建修改后的字符串字面值,但您永远无法恢复原始的换行符。