Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
bgColor#FFCCCC
enum WidgetEnum { WE_W, WE_X, WE_Y, WE_Z } widget_type;

widget_type = 45; 
  
switch (widget_type) {
  case WE_X: 
    /* ... */
    break;
  case WE_Y: 
    /* ... */
    break;
  case WE_Z: 
    /* ... */
    break;
}   

Implementation Details

Microsoft Visual C++ .NET with /W4 does not warn when assigning an integer value to an enum type, or when the switch statement does not contain all possible values of the enumeration.

...

Originally, the consensus among those writing best - practices was simply that each switch statement should have a default label.   Eventually there emerged compilers and static analysis tools that could verify that a switch on an enum type contained a case label for each enumeration value, but only if no default label existed.   This led to a shift toward purposely leaving out the default label to allow static analysis.   However, the resulting code was then vulnerable to enum variables being assigned int values outside the set of enum values.

These two practices have now been merged.   A switch on an enum type should now contain a case label for each enum value, but should also contain a default label for safety.   This is not more difficult to analyze statically.

Existing implementations are in transition, with some not yet analyzing switch statements with default labels.   Developers must take extra care to check their own switch statements until the new practice becomes universal.

...