3 ms·
If you compile with `-Wall` GCC will emit a warning for failing to exhaustively check enum values inside a switch statement (I don't remember the specific unde
by ZephyrP 7y ago
If you compile with `-Wall` GCC will emit a warning for failing to exhaustively check enum values inside a switch statement
(I don't remember the specific underlying feature flag name, sorry).
EDIT: It's called `-Wswitch`
- seren 7y agoYes, apparently, there is a -Wswitch statement in gcc, which looks quite similar, maybe I have used too old compilers... > Warn whenever a switch statement has an index of enumerated type and lacks a case for one or more of the named codes of that enumeration. (The presence of a default label prevents this warning.) case labels outside the enumeration range also provoke warnings when this option is used (even if there is a default label). This warning is enabled by -Wall.
- SAI_Peregrinus 7y agoThe issue with -Wswitch (and thus -Wall) is that the presence of a default case suppresses the warning. Which you may not want, if you need non-default behavior because you're adding a new value! There's -Wswitch-enum (not turned on by -Wall or -Wextra) that stops this being suppressed. This is good, though the (possible) list of cases that are well-handled by the default at the end of switches that just fall-through can be ugly.
- marcosdumay 7y agoA default case supreses the warning in Haskell too, there is no other option. The real problems with C enums aren't about matching completion, they are that: - There is no guarantee that a variable value is in the enum range; - A C (or Java, or C#) enum is a very poor type and can not represent all the data that a Rust enum carries. Developers usually use them with union types to solve that problem, but then there aren't any warnings for most problems anymore.
- nicoburns 7y agoThe big difference is that C++ emums can't contain data. C++ has checking on enums, but enums are a relatively niche data structure for specific use cases. In Rust, enums are a core data structure with completely equal status to structs, and are used pervasively throughout the language including the standard library. Notably, both Option (which is used instead of null) and Result (which is used for error handling) are enums, which means that you thse correctness checks for every null and every error condition, on by default. Thats a huge deal as these are often the source of unexpected runtime errors.