在this answer的评论中,出现了一个争议,即在翻译期间是否需要符合C2011的实现,以执行未加前缀的字符串文字与相邻的前缀字符串文字的字符串连接。例子:
char16_t ustring[] = u"Unicode" " string";
wchar_t wstring[] = "Wide " L"string";
C99 did specify that such concatenation takes place。 C ++ 2011也是pretty clear on the topic。然而,C2011的相关条款与其中任何一条都有不同且更具限制性的措辞:
在翻译阶段6中,由任何相邻字符序列和相同前缀字符串文字标记指定的多字节字符序列被连接成单个多字节字符序列。 [...]
(C2011,6.4.5 / 5;重点补充)
当然,一个带前缀的字符串文字和一个没有前缀的字符串不是"相同的前缀",对吧?
另一方面,该段继续,
[...]如果任何令牌具有编码前缀,则生成的多字节字符序列被视为具有相同的前缀;否则,它被视为字符串文字。是否可以连接带有不同前缀的宽字符串文字标记,如果是这样,生成的多字节字符序列的处理是实现定义的。
其中第一部分似乎是在讨论相关案例,但它似乎也依赖于首先执行的连接,而没有指明必须执行。也许最后一部分是为了允许它作为实现定义的行为,但它并不完全适合,因为虽然前缀和未加前缀的文字肯定是"不同的前缀",但它们不是宽
当然,似乎我所描述的这种连接是意图要执行,例如见第6.4.5 / 9段。但正如所有语言律师所知,这些例子都是非规范性的。是否有合理的方式来解释规范性文本以要求符合要求的实现来执行此连接?或者应该缺少相同的标准中的缺陷?是否实现定义是否执行此类连接?
答案 0 :(得分:4)
p2来自同一小节:
字符串文字是零或多个多字节的序列 用双引号括起来的字符,如
"xyz"
。
再次阅读报价,强调我的:
在翻译阶段6中,指定的多字节字符序列 任何序列的相邻字符和相同前缀的字符串 文字标记连接成一个多字节字符 序列
您可以连接相邻的字符串文字标记和相同前缀的字符串文字标记。
(为避免任何疑问,C中没有“字符文字”; 'c'
是字符常量,参见§6.4.4.4。)