在C和C ++中打破字符串文字是有效的,因为预处理器或编译器会 连接相邻的字符串文字。
const char *zStr = "a" "b"; // valid
当字符串文字以L
(宽字符),u
(UTF-16),U
(UTF-32),u8
为前缀时会发生什么(UTF -8)和原始字符串文字(R"foo(this is a "raw string literal" with double quotes)foo"
)?
例如,允许以下内容:
const wchar_t *zStr = L"a" "b"; // valid?
答案 0 :(得分:12)
在C ++ 0x中,根据[lex.string] / p13:
,您的示例有效...如果一个字符串文字没有 encoding-prefix,它被视为一个 字符串文字相同 encoding-prefix作为另一个操作数。 ...
在C ++ 03中,同一部分说这段代码有不确定的行为:
...如果是一个狭窄的字符串文字标记 与宽字符串文字相邻 令牌,行为未定义。 ...
答案 1 :(得分:4)
是的,C ++ 0x允许该特定示例。前缀和L前缀文字的任何组合都将被视为L-prefixed。
编辑:引文 - N3242(当前C ++ 0x工作草案)§2.14.5/ 13:
在翻译阶段6(2.2)中,连接相邻的字符串文字。如果两个字符串文字具有相同的encoding-prefix,则生成的连接字符串文字具有该encoding-prefix。如果一个字符串文字没有编码前缀,则将其视为与另一个操作数相同的编码前缀的字符串文字。