使用GCC,如果您switch在某个enum值上并且其中一个枚举缺少一个case语句,则会发出警告.当您添加default项目时,将不再发出警告,这在一般情况下是有意义的.
有没有办法使用一个default语句,如果不enum涵盖所有值,仍然会有警告?由于我的函数可能会处理不纯的输入,我想要涵盖一般情况,但仍然会收到关于错过枚举情况的编译器警告.
目前我最终在switch语句后分配了一个默认值.
Dam*_*mon 12
-Wswitch-enum,但不幸的是只有最新版本支持这个.
(当然,您可以通过在交换机外部使用goto并省略默认值来模拟您想要的行为,但我强烈建议不要这样做,它很难看,其他人阅读您的代码会有WTF经验.)
阅读“David Rodr\xc3\xadguez -dribeas”的链接后,我认为总结那里列出的选项会很有帮助。
\n\n有两种方法可以做到这一点 - 要么为所有switch语句打开有关缺少枚举案例的消息,然后为您不关心的语句禁用它,或者将其保留为默认值并强制为switch您关心的那些语句启用错误真的很关心。
选项 1:向所有人发出警告,将某些标记为静音
\n\n首先,添加-Wswitch-enum到编译器标志,以便所有switch语句,即使是带有default子句的语句,如果未处理枚举,都会生成警告。
然后,对于那些switch您希望案例default处理事情并且不希望看到警告的语句,请switch像这样包装语句:
#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored "-Wswitch-enum"\n\nswitch () {\n ...\n}\n\n#pragma GCC diagnostic pop\nRun Code Online (Sandbox Code Playgroud)\n\n这将暂时禁用-Wswitch-enum该 case 语句的标志(隐藏有关丢失枚举案例的警告)。
选项 2:仅在被标记时发出警告
\n\n由于默认的 GCC 行为是在存在子句时隐藏警告default,因此不需要为此选项更改编译器标志。
相反,对于那些switch包含default子句的语句,但您仍然希望看到有关缺少枚举案例的警告,请switch像这样包装:
#pragma GCC diagnostic push\n#pragma GCC diagnostic warning "-Wswitch-enum"\n\nswitch () {\n ...\n}\n\n#pragma GCC diagnostic pop\nRun Code Online (Sandbox Code Playgroud)\n\n这会暂时启用和行-Wswitch-enum之间的标志,从而导致即使存在子句,也会显示有关缺少枚举案例的消息。如果您希望编译因缺少案例而失败,则可以将单词更改为。pushpopdefaultwarningerror