C++标准是否保证“a”“b”合并到“ab”?
下面的代码是cpp标准吗??
我以前看过它,效果很好。
但是,我不确定这个标准是否还没有。
#include <iostream>
int main(){
const char str[] = "a" "b";
std::cout << str << std::endl;
return 0;
}
回答
预处理器有一个合并相邻字符串文字的步骤。如果分隔字符串文字的唯一内容是空格,则它们会合并为一个组合字符串文字。
[lex.string]/7 中描述了完整的过程
在翻译阶段 6 ([lex.phases]) 中,连接相邻的字符串文字。如果两个字符串字面量具有相同的编码前缀,则生成的串联字符串字面量具有该编码前缀。如果一个字符串文字没有编码前缀,则将其视为与另一个操作数具有相同编码前缀的字符串文字。如果 UTF-8 字符串文字标记与宽字符串文字标记相邻,则程序格式错误。任何其他连接都由实现定义的行为有条件地支持。
[注 3:这种串联是一种解释,而不是一种转换。因为解释发生在翻译阶段 6(在字符串字面量的相关字符编码中对字符串字面量内容进行编码之后),字符串字面量的初始原始性对连接的解释或格式良好没有影响。— 尾注]
Table 13 has some examples of valid concatenations. source means source means source means ------------------------------------------------------ |u"a" u"b" u"ab" | U"a" U"b" U"ab" | L"a" L"b" L"ab" | |u"a" "b" u"ab" | U"a" "b" U"ab" | L"a" "b" L"ab" | | "a" u"b" u"ab" | "a" U"b" U"ab" | "a" L"b" L"ab" | ------------------------------------------------------
连接字符串中的字符保持不同。[示例 2:"xA" "B" 包含连接后的两个字符 'xA' 和 'B'(而不是单个十六进制字符 'xAB')。— 结束示例]