原始字符串
一个显着的区别是 C++ 的字符串文字是 C 字符串文字的超集。具体来说,C++ 现在支持原始字符串 http://www.stroustrup.com/C++11FAQ.html#raw-strings (不支持 http://coliru.stacked-crooked.com/a/bfe6aad38cd69d73在 C) 中,技术上定义于 §2.14.15,通常用于 HTML 和 XML,其中"
是经常遇到的。
原始字符串允许您以以下形式指定自己的分隔符(最多 16 个字符):
R"delimiter(char sequence)delimiter"
这对于通过提供您自己的字符串分隔符来避免不必要的转义字符特别有用。以下两个示例展示了如何避免转义"
and (
分别:
std::cout << R"(a"b"c")"; // empty delimiter
std::cout << '\n';
std::cout << R"aa(a("b"))aa"; // aa delimiter
// a"b"c"
// a("b")
Live demo http://coliru.stacked-crooked.com/a/1bfb25b515e5d92c
char
vs const char
注释中指出的另一个区别是字符串文字具有类型char [n]
在 C 中,如 §6.4.5/6 中所规定:
对于字符串文字,数组元素的类型为 char,并使用多字节字符序列的各个字节进行初始化。
而在 C++ 中它们有类型const char [n]
,如 §2.14.5/8 中定义:
普通字符串文字和 UTF-8 字符串文字也称为窄字符串文字。一个箭头
字符串文字的类型为“array of n const char”,其中 n 是字符串的大小(如下定义),并且具有
静态存储持续时间(3.7)。
这并没有改变这样一个事实:在两个标准(分别针对 C 和 C++ 的 §6.4.5/7 和 2.14.5/13)中,尝试修改字符串文字会导致未定义的行为。
未指定与定义的实现(ref https://stackoverflow.com/questions/2397984/undefined-unspecified-and-implementation-defined-behavior)
另一个微妙的区别是,在 C 中,字符串文字的字符数组是否不同是未指定的,根据 §6.4.5/7:
如果这些数组的元素具有适当的值,则未指定这些数组是否不同。
而在 C++ 中,这是根据 §2.14.5/13 定义的实现:
所有字符串文字是否不同(即存储在不重叠的对象中)是由实现定义的。