string literal
字符串文字
句法
" (unescaped_character|escaped_character)* " | (1) | |
---|---|---|
L " (unescaped_character|escaped_character)* " | (2) | |
u8 " (unescaped_character|escaped_character)* " | (3) | (since C++11) |
u " (unescaped_character|escaped_character)* " | (4) | (since C++11) |
U " (unescaped_character|escaped_character)* " | (5) | (since C++11) |
prefix(optional) R "delimiter( raw_characters )delimiter" | (6) | (since C++11) |
解释
unescaped_character | - | Any valid character except the double-quote ", backslash \, or new-line character |
---|---|---|
escaped_character | - | See escape sequences |
prefix | - | One of L, u8, u, U |
delimiter | - | A character sequence made of any source character but parentheses, backslash and spaces (can be empty, and at most 16 characters long) |
raw_characters | - | Any character sequence, except that it must not contain the closing sequence )delimiter" |
1%29窄多字节字符串文字。无前缀字符串的类型为const char[]
...
2%29宽字符串文字。a的类型L"..."
字符串文字是const wchar_t[]
...
3%29 UTF-8编码字符串文字.。a的类型u8"..."
字符串文字是const char[]
...
4%29 UTF-16编码字符串文字.。a的类型u"..."
字符串文字是const char16_t[]
...
5%29 UTF-32编码字符串文字.。a的类型U"..."
字符串文字是const char32_t[]
...
6%29生字串文字。用于避免转义任何字符,分隔符之间的任何内容都成为字符串的一部分。前缀,如果存在的话,具有与上面描述的相同的含义。
注记
空字符%28'\0'
,,,L'\0'
,,,char16_t()
,etc%29总是追加到字符串文本:因此,字符串文本"Hello"
是const char[6]
保持字符'H'
,,,'e'
,,,'l'
,,,'l'
,,,'o'
,和'\0'
...
并排放置的字符串文本被连接在翻译阶段6%28后的预处理%29。也就是说,"Hello," " world!"
生成%28单%29字符串"Hello, world!"
如果两个字符串的编码前缀%28相同,或者两个字符串都没有%29,则产生的字符串将具有相同的编码前缀%28或没有前缀%29。
If one of the strings has an encoding prefix and the other doesn't, the one that doesn't will be considered to have the same encoding prefix as the other. L"Δx = %" PRId16 // at phase 4, PRId16 expands to "d" // at phase 6, L"Δx = %" and "d" form L"Δx = %d" If a UTF-8 string literal and a wide string literal are side by side, the program is ill-formed. | (since C++11) |
---|
任何编码前缀的其他组合都可能被实现所支持,也可能不被支持。这种级联的结果是实现定义的。
字符串文字静态存储持续时间,从而存在于程序生命的记忆中。
字符串文本可用于初始化字符数组如果数组初始化为char str[] = "foo";
,,,str
将包含字符串的副本。"foo"
...
允许编译器,但不需要
若要组合相等或重叠字符串文本的存储空间,请执行以下操作。这意味着,通过指针进行比较时,相同的字符串文本可能比较相等,也可能不相同。
二次
bool b = "bar" == 3+"foobar" // could be true or false, implementation-defined
二次
尝试修改字符串文本的结果。未定义行为
*它们可以存储在只读存储器%28中,例如.rodata
%29或与其他字符串文本组合:
二次
const char* pc = "Hello";
char* p = const_cast<char*>(pc
p[0] = 'M'; // undefined behavior
二次
在C中,字符串文字是类型的。char[]
,并可直接分配给%28 non-const
%29。char*
.C++03也允许它使用%28,但反对它,因为文字是const
在C++%29中。C++11不再允许在没有强制转换的情况下进行这种分配。
字符串文本不一定是C字符串:如果字符串文本嵌入了空字符,则表示包含多个字符串的数组。
二次
const char* p = "abc\0def"; // std::strlen(p) == 3, but the array has size 8
二次
如果一个有效的十六进制数字跟随字符串文本中的十六进制转义,它将无法编译为无效的转义序列。字符串连接可用作解决方法:
二次
//const char* p = "\xfff"; // error: hex escape sequence out of range
const char* p = "\xff""f"; // OK: the literal is const char[3] holding {'\xff','f','\0'}
二次
窄多字节字符串文本%281%29和宽字符串文本%282%29的编码是实现定义的。例如,gcc使用命令行选项-fexec-charset
和-fwide-exec-charset
...
例
二次
#include <iostream>
char array1[] = "Foo" "bar";
// same as
char array2[] = { 'F', 'o', 'o', 'b', 'a', 'r', '\0' };
const char* s1 = R"foo(
Hello
World
)foo";
//same as
const char* s2 = "\nHello\nWorld\n";
int main()
{
std::cout << array1 << '\n';
std::cout << array2 << '\n';
std::cout << s1;
std::cout << s2;
}
二次
产出:
二次
Foobar
Foobar
Hello
World
Hello
World
二次
另见
字符串文字的C文档
*。
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。