4

我想知道是否所有编译器都会像 VS2005 那样在 switch 语句中默默地忽略标签之前的代码。

这就是我所追求的:

#define CASE break; case

所以,

switch (i) {
  CASE 0:  print("0");
  CASE 1:  print("1");
}

会变成

switch (i) {
  break;
  case 0:  print("0");  break;
  case 1:  print("1");
}

从标准来看,第一个“中断”(以及那里的任何其他代码,如果存在的话)似乎很清楚不会被执行。该标准并不否认此类代码的存在,但我不能确定实际的编译器。

4

2 回答 2

4

是的,这是 §6.4.2¶5 暗示的(特别是忽略的部分):

当 switch 语句被执行时,它的条件被评估并与每个 case 常量进行比较。如果 case 常量之一等于条件的值,则将控制权传递给匹配的 case 标签后面的语句。如果没有大小写常量与条件匹配,并且如果存在默认标签,则控制传递到由默认标签标记的语句。如果没有大小写匹配并且没有默认值,则不会执行 switch 中的任何语句。

但是,我认为您的宏不是一个好主意。

于 2012-09-03T22:26:35.177 回答
1

就个人而言,我将“无法”编写这样的代码,因为所有警告都会变成错误,并且可能会出现无法访问的代码警告......事实上,对 clang++ 的快速测试会输出这样的警告。

于 2012-09-03T22:28:38.687 回答