【问题标题】:Using prefix with string literal split over multiple lines使用带有字符串文字的前缀拆分多行
【发布时间】:2021-12-13 03:25:12
【问题描述】:

我有一个 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";

所有似乎都可以编译,但恐怕其中一些可能是实现定义的。

【问题讨论】:

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

标签: c++ multiline prefix string-literals


【解决方案1】:

您可以在此处使用原始字符串文字:

const char8_t x[]  =
u8R"(aaa
bbb©
ccc
)";

您不需要明确声明换行符。缩进被保留。 这是一个缩进的例子:

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

【讨论】:

  • @NO_NAME 我在示例中添加了缩进。
  • @NO_NAME 我恢复了原始缩进,但添加了一个缩进示例。
【解决方案2】:

this cppreference page 看来,您的所有代码 sn-ps 都是等效且定义明确的:

连接


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

或者,来自this Draft C++17 Standard

5.13.5 字符串文字      [lex.string]


13      在翻译阶段 6 (5.2) 中,相邻的 string-literals 被连接。如果两个 string-literals 具有相同的 encoding-prefix,则生成的串联字符串文字具有该 encoding-prefix。如果一个 string-literal 没有 encoding-prefix,则将其视为相同 encoding-prefixstring-literal /em> 作为另一个操作数。 …

猜你喜欢
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 2016-03-24
  • 2019-01-06
  • 2021-09-16
  • 1970-01-01
相关资源
最近更新 更多