2014-03-26 40 views
1

块在这我的工作代码已经宏字符串化文本的在C++ 11

#define STRINGIFY(...) #__VA_ARGS__ 

定义。

这确实有缺点,它会忽略换行符。

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

鉴于宏观形式已经存在,我想保留使用STRINGIFY宏观

但是考虑到有参与报价,你会如何定义STRINGIFY使用新的字符串文字格式?

反正也有#ifdef s在STRINGIFY宏吗?

编辑我希望有一个定义将在C++ 11

EDIT2转化为R"literal(...)literal" 我已经能够获得最接近的是:

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

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

+1

目前尚不清楚你想要做什么。你能给出一个输入和期望输出的例子吗? –

+2

你不能(#总是输出旧的文字),玩得开心。 –

+0

@ n-m说,不能真正告诉你目前想要达到什么目标,所以样本输入和期望的输出将会很方便:)也想知道是否有一个特定的原因用宏编码?因为您无法像调试函数那样轻松地调试或控制它们。 – GMasucci

回答

2

这不完全是你要求的,而是作为@R。 Martinho费尔南德斯建议您可以使用原始文本:

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

+1:这是唯一理智的做法。目前尚不清楚为什么需要一个宏,因此,当原始字符串文字已经明确提供这种功能时,为什么要跳过这个循环以使其按照需要工作就更不明白了。这就是为什么他们被添加到语言。 –

1

这是不可能保存在您希望的方式换行,因为stringise运营商明确丢弃它们。在之前的任何翻译阶段都无法访问它们,并且以后无法恢复它们。

[cpp.stringize]¶2[...]在参数的预处理标记之间出现的每个空白变成字符串文字中的单个空格字符。第一个预处理标记之前和包含参数的最后一个预处理标记之后的空白被删除。 [...]

你也许可以写一个constexpr函数,建立了一个修改后的字符串由根据一些启发发明了新行文字,但你永远无法恢复原来的换行。