我已经看到并使用了如下的C++代码:
int myFourcc = 'ABCD';
它适用于最近的GCC版本,不知道最近的版本.这个功能是否在标准中?这叫什么?
我在网上搜索时遇到了麻烦......
编辑:
对于未来的观察者,我也发现了这些信息:
来自gcc文档
编译器一次为一个字符定义一个多字符字符常量,将前一个值左移每个目标字符的位数,然后在截断到目标宽度的新字符的位模式中输入字符.最终的位模式为int类型,因此无论单个字符是否有符号都是有符号的(与版本3.1及更早版本的GCC略有不同).如果常量中的字符数多于目标int中的字符数,则编译器会发出警告,并忽略多余的前导字符.
例如,具有8位字符的目标的'ab'将被解释为
(int) ((unsigned char) 'a' * 256 + (unsigned char) 'b')', and '\234a' as
(int)((unsigned char)'\ 234'*256 +(unsigned char)'a')'.
Adam Rosenfi.. 7
见C99标准第6.4.4.4节第10段:
整数字符常量具有类型
int
.包含映射到单字节执行字符的单个字符的整数字符常量的值是解释为整数的映射字符的表示的数值.包含多个字符(例如'ab'
)的整数字符常量的值 ,或包含未映射到单字节执行字符的字符或转义序列的值是实现定义的.如果整数字符常量包含单个字符或转义序列,则其值是当char
值为单个字符或转义序列的类型的对象转换为类型时生成的值int
.
回想一下,实现定义意味着实现(在这种情况下,C编译器)可以做任何想做的事情,但必须记录.
大多数编译器将其转换为对应于与各个字符对应的八位字节串联的整数常量,但字节序可以是小端或大端,具体取决于目标体系结构的字节顺序.
因此,可移植代码不应使用多字符常量,而应使用普通的整数常量.而不是'abcd'
,可能是任何字节序,而是使用0x61626364或0x64636261,它们具有已知的字节序(分别为大和小).
见C99标准第6.4.4.4节第10段:
整数字符常量具有类型
int
.包含映射到单字节执行字符的单个字符的整数字符常量的值是解释为整数的映射字符的表示的数值.包含多个字符(例如'ab'
)的整数字符常量的值 ,或包含未映射到单字节执行字符的字符或转义序列的值是实现定义的.如果整数字符常量包含单个字符或转义序列,则其值是当char
值为单个字符或转义序列的类型的对象转换为类型时生成的值int
.
回想一下,实现定义意味着实现(在这种情况下,C编译器)可以做任何想做的事情,但必须记录.
大多数编译器将其转换为对应于与各个字符对应的八位字节串联的整数常量,但字节序可以是小端或大端,具体取决于目标体系结构的字节顺序.
因此,可移植代码不应使用多字符常量,而应使用普通的整数常量.而不是'abcd'
,可能是任何字节序,而是使用0x61626364或0x64636261,它们具有已知的字节序(分别为大和小).
"请注意,根据C标准,字符常量的长度没有限制,但包含多个字符的字符常量的值是实现定义的.最新版本的GCC提供支持多字节字符常量,而不是错误警告多字符字符常量或警告:在这种情况下生成字符常量太长的类型."
C++标准草案说:
字符文字是用单引号括起来的一个或多个字符,如'x'
和
包含多个c-char的普通字符文字是多字符文字.多字符文字具有int类型和实现定义值.