11

在 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?
4

2 回答 2

12

在 C++0x 中,您的示例根据 [lex.string]/p13 有效:

...如果一个字符串文字没有编码前缀,则将其视为与另一个操作数具有相同编码前缀的字符串文字。...

在 C++03 中,同一部分表示此代码具有未定义的行为:

...如果窄字符串文字标记与宽字符串文字标记相邻,则行为未定义。...

于 2011-03-03T15:41:00.393 回答
4

是的,C++0x 允许该特定示例。无前缀和带 L 前缀的文字的任何组合都将被视为都是带 L 前缀的。

编辑:引文——N3242(当前 C++0x 工作草案)§2.14.5/13:

在翻译阶段 6 (2.2) 中,连接相邻的字符串文字。如果两个字符串文字具有相同的编码前缀,则生成的串联字符串文字具有该编码前缀。如果一个字符串文字没有编码前缀,则将其视为与另一个操作数具有相同编码前缀的字符串文字。

于 2011-03-03T10:25:23.697 回答