切换标签前写的一些代码,可以吗?

时间:2012-09-03 22:22:37

标签: c++ switch-statement

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

这就是我追求的目标:

#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");
}

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

2 个答案:

答案 0 :(得分:4)

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

  

执行switch语句时,将评估其条件并与每个case常量进行比较。如果   其中一个case常量等于condition的值,control被传递给下面的语句   匹配的案例标签。如果没有case常量匹配条件,并且如果有一个默认标签,则控制   传递给默认标签标记的语句。如果没有大小写匹配,那么没有默认值   交换机中没有任何语句被执行。

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

答案 1 :(得分:1)

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