ISO/IEC 9899:2011 条款6.4.5——字符串字面量
6.4.5 字符串字面量
语法
1、string-literal:
encoding-prefixopt " s-char-sequenceopt "
encoding-prefix:
u8
u
U
L
s-char-sequence:
s-char:
s-char-sequence s-char
s-char:
源字符集中的任一成员,除了双引号 " ,倒斜杠 \ ,或换行字符
escape-sequence
约束
2、毗邻的字符串字面量标记的一个序列不应该同时包括一个宽字符串字面量和一个UTF-8字符串字面量。
描述
3、一个字符串字面量是零个或多个多字节字符封闭在双引号中的一个序列,比如 "xyz" 。一个UTF-8字符串字面量同样如此,除了带有前缀u8。一个宽字符串字面量也同样如此,除了标有前缀L、u或U。
4、同样的考虑应用于一个字符串字面量中的序列的每个元素,就好比它是一个整型字符常量(对于一个字符或UTF-8字符串字面量),或是一个宽字符常量(对于一个宽字符串字面量),除了单引号 ' 要么可以通过自身,要么通过转义序列 \' 来表示,但双引号 " 应该可以通过转义序列 \" 来表示。
语义
5、在翻译阶段6中,由任一毗邻的字符与相同前缀的字符串字面量标记序列所指定的多字节字符序列被拼接成一单个多字节字符序列。如果这些标记中的任何一个具有一个编码前缀,那么结果多字节字符序列被看作为具有相同的前缀;否则,它被看作为一个字符串字面量。不同前缀的宽字符串字面量标记是否可以被拼接,并且如果可以,如何看待结果多字节字符序列是实现定义的。
6、在翻译阶段7中,值为0的一个字节或ASCII码被添加到每个多字节字符序列的后面,形成一个字符串字面量或字面量。[注:一个字符串字面量不需要是一个字符串(见7.1.1),因为一个空字符可以通过一个 \0 转义序列被嵌入进去。]多字节字符序列然后被用于初始化一个静态存储周期的数组,并且长度恰好满足包含该序列。对于字符串字面量,数组元素具有类型char,并且以多字节字符序列的各个字节被初始化。对于UTF-8字符串字面量,数组元素具有类型char,并且以编码为UTF-8的多字节序列的字符被初始化。对于前缀为字母L的宽字符串字面量,数组元素具有类型wchar_t,并且以相应于多字节字符序列(通过mbstowcs函数所定义的,并具有实现定义的当前本地语言)的宽字符序列进行初始化。对于前缀为字母u或U的宽字符串字面量,数组元素分别具有类型char16_t或char32_t,并且以相应于多字节字符序列(通过连续地调用mbrtoc16或mbrtoc32函数,根据适当的类型,并带有实现定义的当前本地语言来定义)的宽字符序列来初始化。包含一个不在执行字符集中所表示的多字节字符或转义序列的一个字符串字面量的值是由实现定义的。
7、这些数组是否为单独提供具有适当值的它们的元素是未指定的。如果程序企图修改这样的一个数组,那么行为是未定义的。
8、例1 这对毗邻的字符串字面量 "\x12" "3" 产生一单个字符串字面量,包含两个字符,其值为 '\x12' 和 '3',因为转义序列恰在毗邻的字符串字面量拼接之前被转换为执行字符集的单个成员。
9、例2 下列毗邻的字符串字面量标记的每个序列
"a" "b" L"c"
"a" L"b" "c"
L"a" "b" L"c"
L"a" L"b" L"c"
是相互等价的字符串字面量——L"abc"
类似的,下列序列的每一个
"a" "b" u"c"
"a" u"b" "c"
u"a" "b" u"c"
u"a" u"b" u"c"
是相互等价的字符串字面量,等价于——u"abc"。