在查看一些打算用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]
警告。
答案 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
,其值取决于实现。
整数字符常量的类型为int。整数的值 包含映射到a的单个字符的字符常量 单字节执行字符是数值 解释为整数的映射字符的表示形式。的的 包含多个的整数字符常量的值 字符(例如,'ab'),或包含字符或转义序列 不映射到单字节执行字符的是 实现定义强>
(强调补充)
海湾合作委员会正在谨慎行事,如果您无意中使用过海湾合作委员会,请发出警告。