【发布时间】:2024-05-16 21:45:01
【问题描述】:
我正在阅读一些模拟器代码,我反驳了一些真正奇怪的东西:
switch (reg){
case 'eax':
/* and so on*/
}
这怎么可能?我以为您只能在整数类型上使用switch。是不是发生了一些宏诡计?
【问题讨论】:
-
不是字符串
'eax',而是枚举常量整数值 -
单引号,不是双引号。一个字符常量被提升为
int,所以它是合法的。但是,多字符常量的值是实现定义的,因此代码可能无法在另一个编译器上按预期工作。例如,eax可能是0x65、0x656178、0x65617800、0x786165、0x6165或其他名称。 -
@Davislor:鉴于变量“reg”的名称,以及 eax 是一个 x86 寄存器的事实,我猜想实现定义的行为本来是可以的,因为它是相同的它在代码中使用的任何地方。当然,只要
'eax' != 'ebx',它只会使您的一两个示例失败。尽管在某处可能有一些代码实际上假定为*(int*)("eax") == 'eax',因此您的大多数示例都失败了。 -
@SteveJessop 我不同意你所说的,但存在真正的危险,即有人可能会尝试在不同的编译器上编译代码,即使对于相同的架构,也会得到不同的行为。例如,
'eax'可能比较等于'ebx'或'ax',并且 switch 语句不会按预期工作。 -
如果您查找/向我们展示了 reg 的数据类型,那么所有这些谜团都会很快被解开。
标签: c switch-statement label constants