如何在多行字符串字面量中使用前缀?

3

我有一个Unicode字符串字面量,就像这样。

const char8_t x[] = u8"aaa\nbbb©\nccc\n";

为了提高可读性,我想把它拆分成多行。

以下哪种符号是正确且等同于上述内容?

const char8_t x[] =
        u8"aaa\n"
        u8"bbb©\n"
        u8"ccc\n";

const char8_t x[] =
        u8"aaa\n"
        "bbb©\n"
        "ccc\n";

const char8_t x[] =
        "aaa\n"
        u8"bbb©\n"
        "ccc\n";

所有的内容似乎都可以编译,但我担心其中一些可能是实现定义的。


显然,你不会使用第三个,因为它可读性较差。 - Phil1970
1
如果你想要可读性,为什么不使用原始字符串字面值?请参见#6:https://en.cppreference.com/w/cpp/language/string_literal。 - Phil1970
@Phil1970 那岂不意味着我必须放弃缩进吗? - Piotr Siupa
1
这取决于您对数据的处理方式。如果您编写SQL、HTML、XML或类似的代码,您可能不需要额外的缩进,或者您可以通过编码来修复它,或者您可能更喜欢没有 "\n 的未缩进文本。此外,您可能可以编写一个 constexpr 函数或运算符来修复该字符串。 - Phil1970
2个回答

4
这个cppreference页面来看,所有的代码片段都是等价且良好定义的:

连接


如果其中一个字符串具有编码前缀而另一个没有,则不具有编码前缀的字符串将被视为具有与另一个字符串相同的编码前缀。


或者从这份C++17标准草案中可以看到:

5.13.5 字符串字面量      [lex.string]


13      在第6个翻译阶段(5.2),相邻的字符串字面量将被连接。如果两个字符串字面量具有相同的编码前缀,则结果连接后的字符串字面量具有该编码前缀。如果一个字符串字面量没有编码前缀,它将被视为具有与另一个操作数相同的编码前缀的字符串字面量。…


在线草案标准链接 - Adrian Mole
那是理论。实际上,我建议在每个包含Unicode字符的行中至少放置前缀,除非你想花费几个小时来调试为什么你的代码在MSVC中无法工作。 - Piotr Siupa

1
你可以使用原始字符串字面量来实现这一点:
const char8_t x[]  =
u8R"(aaa
bbb©
ccc
)";

您不需要显式地指定换行符。缩进将被保留。

以下是一个带有缩进的示例:

const char8_t x[] =
u8R"(SomeRecord
    Name: $NAME
    Date: $DATE
)";

@NO_NAME 我给这个例子添加了缩进。 - emsr
@NO_NAME 我已经恢复了原始缩进,但添加了一个缩进的示例。 - emsr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接