【发布时间】: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