我想知道所有编译器是否会在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");
}
从标准看来,似乎很清楚第一个“中断”(以及任何其他代码,如果它存在)将不会被执行。该标准并不否认存在此类代码,但我无法确定实际的编译器。
答案 0 :(得分:4)
是的,§6.4.2¶5(特别是忽略部分)暗示了这一点:
但是,我不认为你的宏是一个好主意。执行switch语句时,将评估其条件并与每个case常量进行比较。如果 其中一个case常量等于condition的值,control被传递给下面的语句 匹配的案例标签。如果没有case常量匹配条件,并且如果有一个默认标签,则控制 传递给默认标签标记的语句。如果没有大小写匹配,那么没有默认值 交换机中没有任何语句被执行。
答案 1 :(得分:1)
就个人而言,我“无法”编写此类代码,因为所有警告都会变成错误,并且可能无法访问代码警告......实际上,对clang ++的快速测试会输出这样的警告。