【问题标题】:Are un-prefixed string literals concatenated with prefixed ones?不带前缀的字符串文字是否与带前缀的字符串连接?
【发布时间】:2017-04-29 00:56:33
【问题描述】:

this answer 的评论中,关于在翻译过程中是否需要符合 C2011 的实现来执行无前缀字符串文字与相邻前缀字符串文字的字符串连接,出现了争议。例子:

char16_t ustring[] = u"Unicode" " string";
wchar_t wstring[] = "Wide " L"string";

C99did specify that such concatenation takes place。 C++2011 也是pretty clear on the topic。但是,C2011 的相关规定与其中任何一项相比,措辞不同且更具限制性:

在翻译阶段 6,由任何相邻字符序列和 相同前缀 字符串文字标记指定的多字节字符序列连接成单个多字节字符序列。 [...]

(C2011,6.4.5/5;强调)

肯定一个带前缀的字符串字面量和一个不带前缀的字面量不是“相同的前缀”,对吧?

另一方面,那段继续,

[...] 如果任何标记具有编码前缀,则生成的多字节字符序列被视为具有相同的前缀;否则,它被视为字符串文字。是否可以连接不同前缀的宽字符串文字标记,如果可以连接,则对生成的多字节字符序列的处理由实现定义。

第一部分似乎与所讨论的情况有关,但它似乎也取决于首先执行的串联,但没有指定必须执行。也许最后一部分是为了允许将其作为实现定义的行为,但它不太适合,因为尽管带前缀和不带前缀的文字肯定是“不同的前缀”,但它们并不是都

当然,我所描述的这种连接似乎是打算执行的,例如第 6.4.5/9 段中介绍的示例。但正如所有语言律师都知道的那样,这些例子是非规范性的。是否有一种合理的方式来解释规范性文本以要求符合要求的实现来执行这种连接?或者是否应该将缺少相同内容视为标准中的缺陷?是否执行此类连接是否由实现定义?

【问题讨论】:

    标签: c language-lawyer


    【解决方案1】:

    来自同一子句的p2:

    字符串字面量是零个或多个多字节的序列 用双引号括起来的字符,如"xyz"

    再次阅读引用,强调我的:

    在翻译阶段 6,多字节字符序列由 任何相邻的字符序列和相同前缀的字符串 文字标记 连接成单个多字节字符 顺序。

    您可以连接相邻的字符串文字标记和具有相同前缀的字符串文字标记。

    (为避免任何疑问,C 中没有“字符文字”;'c' 是一个字符常量,参见 §6.4.4.4。)

    【讨论】:

    • 啊哈。这正是我一直在寻找的。 p6 的语言仍然令人困惑并且对多种解释持开放态度,但 p2 提供了支持示例所需的额外规范性文本,以指导解释。
    猜你喜欢
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 2022-06-10
    • 2016-04-28
    • 2015-04-28
    • 1970-01-01
    • 2016-06-15
    • 2021-06-08
    相关资源
    最近更新 更多