Using GCC, if you switch
on an enum
value and one of the enums is missing a case
statement a warning will be emitted. When you add a default
item the warning will no longer be emitted, which makes sense in the general case.
Is there a way to use a default
statement and still have a warning if not all the enum
values are covered? Since my function may deal with impure input I'd like to cover the generic case but still get compiler warnings about missing an enum case.
Currently I end up assigning a default after the switch statement.
-Wswitch-enum, but unluckily only the most recent version supports this.
(You could of course simulate the behaviour that you want by using a goto outside the switch and omitting the default, but I would strongly advise against that, it's ugly and someone else reading your code would have a WTF experience.)
After reading the link from "David Rodríguez - dribeas", I thought it would be helpful to summarise the options listed there.
There are two ways to do this - either turn the messages about missing enum cases on for all switch
statements, then disable it for the ones you don't care about, or leave it at the default and force the errors on for those switch
statements you really care about.
Option 1: Warnings for all, mark some as silent
First, add -Wswitch-enum
to your compiler flags, so that all switch
statements, even ones with a default
clause, will have warnings generated if an enum is not handled.
Then, for those switch
statements where you want the default
case to take care of things and don't want to see warnings, wrap the switch
statement like this:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wswitch-enum"
switch () {
...
}
#pragma GCC diagnostic pop
This will temporarily disable the -Wswitch-enum
flag (hiding the warnings about missing enum cases) just for that case statement.
Option 2: Only warn when flagged to do so
Since the default GCC behaviour is to hide warnings when a default
clause is present, the compiler flags don't need to be changed for this option.
Instead, for those switch
statements that include a default
clause, but you still want to see warnings about missing enum cases, wrap the switch
like this:
#pragma GCC diagnostic push
#pragma GCC diagnostic warning "-Wswitch-enum"
switch () {
...
}
#pragma GCC diagnostic pop
This temporarily enables the -Wswitch-enum
flag between the push
and pop
lines, causing messages about missing enum cases to be displayed even when a default
clause is present. You can change the word warning
to error
if you want compilation to fail on a missing case.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With