C中的多字符字符常量是否有效?也许在MS VC?

时间:2016-11-15 12:13:55

标签: c visual-c++ char

在查看一些打算用MS Visual C ++编译的WINAPI代码时,我发现了以下内容(简化):

char buf[4];

// buf gets filled ...

switch ((buf[0] << 8) + buf[1]) {
    case 'CT':
        /* ... */

    case 'SY':
        /* ... */

    default:
        break;

    }
}

假设16位字符,我可以理解为什么buf[0]的移位和buf[1]的加法。我不能收集的是案例条款中的比较是如何起作用的。

我无法访问Visual C ++,当然,这些会在gcc / MingW上产生multi-character character constant [-Wmultichar]警告。

2 个答案:

答案 0 :(得分:4)

这是一种在一个char中存储多个int的非便携方式。最后,比较像往常一样作为int值发生。

注意:请考虑将每个char的ASCII值的连续表示形式作为最终int

关注wiki文章,(强调我的

  

[...]多字符常量(例如'xy')是有效的,虽然很少有用 - 它们允许一个整数存储多个字符(例如,4个ASCII字符可以容纳32位整数, 64位中的8位)。 由于未指定将字符打包到int中的顺序,因此难以轻松使用多字符常量。

相关,C11,章节§6.4.4.4/ p10

  

整数字符常量的类型为int。整数字符常量的值   包含映射到单字节执行字符的单个字符是   解释为整数的映射字符表示的数值。   包含多个字符的整数字符常量的值(例如,   'ab'),或包含不映射到单字节的字符或转义序列   执行字符,是实现定义的。 [....]

答案 1 :(得分:4)

是的,它们是有效的,其类型为int,其值取决于实现。

来自C11 draft, 6.4.4.4p10

  

整数字符常量的类型为int。整数的值   包含映射到a的单个字符的字符常量   单字节执行字符是数值   解释为整数的映射字符的表示形式。的的   包含多个的整数字符常量的值   字符(例如,'ab'),或包含字符或转义序列   不映射到单字节执行字符的是   实现定义

(强调补充)

海湾合作委员会正在谨慎行事,如果您无意中使用过海湾合作委员会,请发出警告。