C11第6.8.1节或C99,或C89的第3.6.1节似乎都表明default
和case x
(其中x
是一些常量表达式)都是带标签的语句示例,以及适用于与goto
一起使用的identifier:
样式标签。
我知道我可以直接在default:
或case x:
标签后面放置一个identifier:
样式标签。但这个问题不是关于那个的。我更想知道是否有任何实际的理由禁止这种行为。
如果可以在switch
选择结构之外声明default:
标签,那么我就能理解了,因为在switch
选择结构内部的goto
的目的地会产生一些冲突。然而,C11的6.4.1节或C99或C89的3.1.1节禁止将default
用作除关键字以外的任何内容,并且6.8.1进一步限制其仅适用于switch
结构(或C11中的generic
结构,在此处无关)。
switch
结构,每个结构都有default:
(或case x:
)标签会引入歧义,但是这些标签的作用范围似乎仅限于它们最内层的switch
结构中,并且引用其作用域之外的任何标识符都明显是一个错误,需要在编译时进行诊断。这个问题在任何标准文档(例如理由)中有讨论吗?除了“因为它就是这样”或“因为规范这样说”之外,还有什么解释这种行为的方式吗?如果有,那是什么解释?
goto
可能很危险,因此不应该使用”,那么请考虑“C语言中的任何功能都可能很危险,因此不应该使用”或者“驾车可能很危险...”。这样说有意义吗?引发“goto很糟糕”的浪潮的那句话最初由艾兹赫尔·迪科斯彻写下,但已被像你一样的人断章取义地使用了几十年,以至于他很久以前就对此进行了评论并表示后悔。 - autisticif/else
、while/do-while
、switch
和函数),那么应该使用它们”...然而,在C语言中仍然存在一小部分用例,其中goto
是最合适的控制结构,最简单的情况是跳转到函数末尾的级联资源清理以进行错误处理或者跳出多个嵌套循环/开关控制结构,而不需要额外的逻辑。 - autisticgoto
的例子,请参见David Tribble的结论中所述的“goto之道”。 - autistic