GCC打开枚举,保留缺少警告但使用默认值

edA*_*a-y 17 c++ gcc

使用GCC,如果您switch在某个enum值上并且其中一个枚举缺少一个case语句,则会发出警告.当您添加default项目时,将不再发出警告,这在一般情况下是有意义的.

有没有办法使用一个default语句,如果不enum涵盖所有值,仍然会有警告?由于我的函数可能会处理不纯的输入,我想要涵盖一般情况,但仍然会收到关于错过枚举情况的编译器警告.

目前我最终在switch语句后分配了一个默认值.

Dam*_*mon 12

-Wswitch-enum,但不幸的是只有最新版本支持这个.

(当然,您可以通过在交换机外部使用goto并省略默认值来模拟您想要的行为,但我强烈建议不要这样做,它很难看,其他人阅读您的代码会有WTF经验.)

  • @ edA-qa mort-ora-y:我相信你可以在pragma指令中使用它,类似于`#pragma GCC诊断警告'-Wswitch-enum"`可以做到这一点.阅读它[这里](http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html) (3认同)
  • 这听起来好像它会为所有 switch 语句打开它。这当然不是我想要的:许多情况只处理少数枚举值。我想要一种可以在每个交换机的基础上启用的方法。 (2认同)

Mal*_*ous 6

阅读“David Rodr\xc3\xadguez -dribeas”的链接后,我认为总结那里列出的选项会很有帮助。

\n\n

有两种方法可以做到这一点 - 要么为所有switch语句打开有关缺少枚举案例的消息,然后为您不关心的语句禁用它,或者将其保留为默认值并强制为switch您关心的那些语句启用错误真的很关心。

\n\n

选项 1:向所有人发出警告,将某些标记为静音

\n\n

首先,添加-Wswitch-enum到编译器标志,以便所有switch语句,即使是带有default子句的语句,如果未处理枚举,都会生成警告。

\n\n

然后,对于那些switch您希望案例default处理事情并且不希望看到警告的语句,请switch像这样包装语句:

\n\n
#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored "-Wswitch-enum"\n\nswitch () {\n    ...\n}\n\n#pragma GCC diagnostic pop\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将暂时禁用-Wswitch-enum该 case 语句的标志(隐藏有关丢失枚举案例的警告)。

\n\n

选项 2:仅在被标记时发出警告

\n\n

由于默认的 GCC 行为是在存在子句时隐藏警告default,因此不需要为此选项更改编译器标志。

\n\n

相反,对于那些switch包含default子句的语句,但您仍然希望看到有关缺少枚举案例的警告,请switch像这样包装:

\n\n
#pragma GCC diagnostic push\n#pragma GCC diagnostic warning "-Wswitch-enum"\n\nswitch () {\n    ...\n}\n\n#pragma GCC diagnostic pop\n
Run Code Online (Sandbox Code Playgroud)\n\n

这会暂时启用和行-Wswitch-enum之间的标志,从而导致即使存在子句,也会显示有关缺少枚举案例的消息。如果您希望编译因缺少案例而失败,则可以将单词更改为。pushpopdefaultwarningerror

\n