From: david.brown@hesbynett.no   
      
   On 23/10/2025 13:03, Thiago Adams wrote:   
   > On 10/23/2025 4:12 AM, David Brown wrote:   
   >> On 22/10/2025 20:22, Kaz Kylheku wrote:   
   >>> On 2025-10-22, Thiago Adams wrote:   
   >>>> On 10/22/2025 8:44 AM, Richard Harnden wrote:   
   >>>> ....   
   >>>>>> Your program fragment is well defined.   
   >>>>>>   
   >>>>>> What the poster certainly tried to express was that in case you   
   >>>>>> haven't implemented a complete list of all possible cases and   
   >>>>>> also not provided a 'default' to catch all non-specified cases,   
   >>>>>> then you might get in troubles with your program, probably by   
   >>>>>> possible oversights, future extensions, new data, and whatnot.   
   >>>>>>   
   >>>>>> Personally I have the habit to always define a default branch,   
   >>>>>> and even if that default is impossible to reach you'll find an   
   >>>>>> error message (like "internal error with unexpected value...")   
   >>>>>> generated at that place.   
   >>>>>>   
   >>>>> Use an enum, and the compiler will warn you ...   
   >>>>>   
   >>>>> $ cat x.c   
   >>>>> #include    
   >>>>>   
   >>>>> enum x {A, B, C};   
   >>>>>   
   >>>>> int main(void)   
   >>>>> {   
   >>>>> enum x x = C;   
   >>>>>   
   >>>>> switch (x)   
   >>>>> {   
   >>>>> case A:   
   >>>>> printf("A\n");   
   >>>>> break;   
   >>>>>   
   >>>>> case B:   
   >>>>> printf("B\n");   
   >>>>> break;   
   >>>>> }   
   >>>>>   
   >>>>> return 0;   
   >>>>> }   
   >>>>>   
   >>>>> $ gcc -Wall x.c   
   >>>>> x.c: In function ‘main’:   
   >>>>> x.c:9:9: warning: enumeration value ‘C’ not handled in switch [-   
   >>>>> Wswitch]   
   >>>>> 9 | switch (x)   
   >>>>> | ^~~~~~   
   >>>>>   
   >>>>>   
   >>>>   
   >>>> The problem with this GCC approach is when there are many enumerators   
   >>>> but only a few are used.   
   >>>   
   >>> The problem with the C and GCC approach is that there is no   
   >>> one-size-fits all solution.   
   >>>   
   >>> Some switches are intended to be exhaustive, such that   
   >>> missing a case is a bug.   
   >>>   
   >>> Some are not.   
   >>>   
   >>> You need an "eswitch" for the exhaustively handled enumerations, and   
   >>> switch for the others.   
   >>>   
   >>> GCC can turn on diagnostics over ranges of a file with pragma   
   >>> and there is also _Pragram, but it's all too clumsy.   
   >>>   
   >>   
   >> The gcc approach works fine in almost all situations - use "-   
   >> Wswitch=error", and add a default case if your switch is not meant to   
   >> handle all enumeration values. If the default should do nothing, it's   
   >> just "default: // Not all cases need handling". If the default should   
   >> never happen, "default: __builtin_unreachable();" or "default:   
   >> __builtin_trap();" might be appropriate.   
   >>   
   >>   
   >>   
   >   
   > But then instead a compiler time error (like I suggest) you leave it for   
   > runtime.   
   >   
   >   
      
   As I said - use "-Wswitch=error". That gives you a compile-time error -   
   not merely a warning, as you had suggested. But /if/ your switch is not   
   meant to handle all cases, which was what Kaz was complaining about,   
   then you add a default case. I agree with you that a compile-time error   
   is best when possible, which is why that was my suggestion.   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   
|