为什么不在交换机中省略"case"...在XCode中抛出错误或警告?

Ben*_*nmj 2 iphone cocoa objective-c ios

在检查一个无法运行的代码时,我意识到我从switch语句中删除了"case".有缺陷的代码具有以下格式

switch (foo) {
   firstElem:
       ...
       break;
   secondElem:
       ...
       break;
}
Run Code Online (Sandbox Code Playgroud)

firstElemsecondElem是一个枚举列表的一部分.当我单步执行代码时,它会跳到switch结束括号,因为它找不到匹配项.

这很容易修复,但它让我感到不安,因为XCode在编译或运行时都没有抱怨.为什么?

  1. 语言结构中是否存在switch case更难以解释的内容?
  2. 是否有一个实例,你想要省略该case语句以产生一些其他行为(我一无所知)?
  3. 这是否会发生在其他语言中?我知道Objective-C是"C的严格超集",所以我假设在C中可能会发生同样的情况(取决于编译器).Java怎么样?C++?

更新:我正在使用XCode 4.4.1(虽然我会在一秒内升级).这是既定项目的一部分.**

进一步的更新和参考 Kevin Ballard正确地指出我不小心定义了标签.有关标签和GOTO的更多信息,您可以在C编程语言 3.8中找到讨论,其中Kernighan和Richie得出结论(尽管它们可能在错误检查中有用)

...依赖于goto语句的代码通常比没有gotos的代码更难理解和维护.虽然我们对这个问题没有教条,但似乎goto语句应该很少使用,如果有的话.

Lil*_*ard 7

你所拥有的是你身上的一堆常规旧标签switch.这完全合法.Xcode没有抱怨,因为没有case语句的开关是合法的,虽然有点奇怪.

也就是说,clang在看到switch没有case陈述的陈述时会发出警告.你在使用GCC吗?

  • @BPMJ:如果你想稍微伤到脑袋,请看[Duff's Device](http://en.wikipedia.org/wiki/Duff's_device)(注意:今天从不使用它,它已经过时了).它实际上使用了一个跨越多个case语句的`do-while`循环. (3认同)