gpt4 book ai didi

C++:多行字符串常量中的行尾是否有标准定义?

转载 作者:IT老高 更新时间:2023-10-28 12:30:01 24 4
gpt4 key购买 nike

如果我有一个多行字符串 C++11 字符串常量,例如

R"""line 1
line 2
line3"""

是否定义了行终止符/分隔符由哪些字符组成?

最佳答案

目的是原始字符串文字中的换行符映射到单个'\n' 字符。这个意图没有表达得那么清楚应该是,这导致了一些困惑。

引用的是 2011 ISO C++ 标准。

首先,这是它映射到单个 '\n' 字符的证据。

第 2.14.5 节 [lex.string] 第 4 段中的注释说:

[ Note: A source-file new-line in a raw string literal results in a new-line in the resulting execution string-literal. Assuming no whitespace at the beginning of lines in the following example, the assert will succeed:

    const char *p = R"(a\
b
c)";
assert(std::strcmp(p, "a\\\nb\nc") == 0);

end note ]

这清楚地表明换行符映射到单个 '\n'特点。它也符合 g++ 6.2.0 和观察到的行为clang++ 3.8.1(在 Linux 系统上使用源文件完成的测试Unix 风格和 Windows 风格的行尾)。

鉴于注释中明确说明的意图和两个人的行为流行的编译器,我会说依赖它是安全的——尽管它看看其他编译器如何处理这个问题会很有趣。

然而,按照规范措辞的字面理解标准很容易导致不同的结论,或者至少有一些不确定性。

第 2.5 节 [lex.pptoken] 第 3 段说(强调添加):

Between the initial and final double quote characters of the raw string, any transformations performed in phases 1 and 2 (trigraphs, universal-character-names, and line splicing) are reverted; this reversion shall apply before any d-char, r-char, or delimiting parenthesis is identified.

翻译阶段在 2.2 [lex.phases] 中指定。在第一阶段:

Physical source file characters are mapped, in an implementation-defined manner, to the basic source character set (introducing new-line characters for end-of-line indicators) if necessary.

如果我们假设物理源文件字符到基本字符集和换行符的引入是“transformations”,我们可以合理地得出结论,例如,Windows 格式的原始字符串文字中间的换行符源文件应该等同于 \r\n 序列。 (我能想象这对特定于 Windows 的代码很有用。)

(这种解释确实会导致系统出现问题,其中行尾指示符不是字符序列,例如其中每一行是一个固定宽度的记录。这样的系统很少见这些天。)

作为 "Cheers and hth. - Alf"'s answer指出,有一个开放的 Defect Report对于这个问题。 2013年提交的,现在还没有解决了。​​

就个人而言,我认为混淆的根源是“任何”这个词(强调如前所述):

Between the initial and final double quote characters of the raw string, any transformations performed in phases 1 and 2 (trigraphs, universal-character-names, and line splicing) are reverted; this reversion shall apply before any d-char, r-char, or delimiting parenthesis is identified.

当然是物理源文件字符到可以合理地想到基本的源字符集作为一个转换。带括号的子句“(三元组,通用字符名称和线拼接)”似乎是有意的指定要还原的哪些转换,但是要么试图改变“转换”这个词的含义(标准没有正式定义)或与使用相矛盾“任何”这个词。

我建议将“任何”一词改为“确定”将表达明显的意图更清楚:

Between the initial and final double quote characters of the raw string, certain transformations performed in phases 1 and 2 (trigraphs, universal-character-names, and line splicing) are reverted; this reversion shall apply before any d-char, r-char, or delimiting parenthesis is identified.

这个措辞会更清楚地表明“三元组,通用字符名称和线拼接”是唯一的要还原的转换。 (并非所有事情都完成了在翻译阶段 1 和 2 被还原,只是那些特定的列出的转换。)

关于C++:多行字符串常量中的行尾是否有标准定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39885423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com