int x ='fooo'是编译器扩展吗?

时间:2009-03-30 22:33:16

标签: c++ c gcc

我已经看过并使用过如下的C ++代码:

int myFourcc = 'ABCD';

它适用于最近的GCC版本,不知道最近的版本。 这个功能是否在标准中? 它叫什么?

我在网上搜索时遇到了麻烦......

编辑:

我也为未来的观察者找到了这些信息:

来自gcc documentation

  

编译器一次为一个字符定义一个多字符字符常量,将前一个值左移每个目标字符的位数,然后在截断到宽度的新字符的位模式中输入一个目标角色。最终的位模式为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') ”。

5 个答案:

答案 0 :(得分:7)

见C99标准第6.4.4.4节第10段:

  

整数字符常量的类型为int。整数字符常量的值   包含映射到单字节执行字符的单个字符是   解释为整数的映射字符表示的数值。   包含多个字符的整数字符常量的值(例如,   'ab'),或包含不映射到单字节的字符或转义序列   执行字符,是实现定义的。如果包含整数字符常量   单个字符或转义序列,其值是当对象具有时产生的值   类型char,其值是单个字符或转义序列的值转换为   输入int

回想一下,实现定义的意味着实现(在这种情况下,C编译器)可以做任何想做的事情,但必须记录

大多数编译器会将其转换为对应于与各个字符对应的八位字节串联的整数常量,但字节序可以是小端或大端,具体取决于目标体系结构的字节顺序。

因此,可移植代码不应使用多字符常量,而应使用普通的整数常量。而不是'abcd',可能是任何字节序,使用0x61626364或0x64636261,它们具有已知的字节序(分别为大和小)。

答案 1 :(得分:6)

“请注意,根据C标准,字符常量的长度没有限制,但包含多个字符的字符常量的值是实现定义的。最新版本的GCC提供支持多字节字符常量,而不是错误警告多字符字符常量警告:在这种情况下会生成字符常量太长的类型。“

答案 2 :(得分:5)

C ++标准草案说:

  

字符文字是一个或多个用单个字符括起来的字符     引号,如'x'

  

包含多个c-char的普通字符文字是多字符文字。多元化     acter literal具有int类型和实现定义值

答案 3 :(得分:1)

是的,它是标准的,但是是实现定义的。

在实际经验中,它表示通过连接字节'A','B','C'和'D'得到的32位整数。

答案 4 :(得分:0)

如果有人感兴趣,给出的具体示例是数据存储格式的ID 能够获得常量的人类可读值非常有用,例如'XVID'而不仅仅是1234。 当你编写任意整数键时,值得思考。