Diciamo che ho un'enumerazione.Cosa inserire in un'etichetta di default di un interruttore?
enum class ShapeName : char {TRIANGLE,CIRCLE,SQUARE};
e poi ho una funzione come questa:
void Function (ShapeName const shape){
switch (shape){
case ShapeName::TRIANGLE:
DoSomething1();
break;
case ShapeName::CIRCLE:
DoSomething2();
break;
case ShapeName::SQUARE:
DoSomething3();
break;
default:
//THIS CODE BLOCK SHOULD NEVER BE EXECUTED!
}
return;
}
Anche se l'etichetta di default non dovrebbe mai essere eseguito, voglio rendere conto dei potenziali bug che possono sorgere se un programmatore aggiunge un altro valore 'ShapeName' e non è rappresentato nello switch.
Cosa vorresti che facessi?
1. Le asserzioni
ho potuto usare un'affermazione, ma quello che sto asserendo?
assert(false); //?
2. Eccezioni
ho potuto un'eccezione, ma non credo che sarebbe molto buona pratica. Ho l'impressione che le eccezioni siano per eventi di runtime che non possono essere previsti a causa di determinati ambienti.
3. Esce
posso solo uscire immediatamente dal programma con un errore. Mi sembra l'idea migliore, ma non sono sicuro che sia una buona pratica. Ho pensato che il vantaggio delle asserzioni era che potevi disattivarle tutte quando eri pronto a spedire il programma. Quindi, tutto quel codice di asserzione non esisterebbe più.
Forse c'è un altro modo di cui non sono a conoscenza. Io uso un flag del compilatore che avverte dei valori non contati, ma voglio ancora sapere cosa gli altri raccomandano.
4. Puoi dire al tuo compilatore di avvisare per questo? È un'opzione che mi aspetterei per le enumerazioni vecchio stile. –
@SteveJessop g ++ -w -Wall -Wextra -Wswitch -Wswitch-default -Wswitch-enum -std = C++ 0x -o main main.cpp strano, non ho ricevuto alcun avviso con il codice precedente. Ho aggiunto un altro ShapeName e ho eliminato l'etichetta predefinita. Ancora niente! –
Ratti. L'implementazione di C++ 11 non è ancora finita, quindi possiamo vivere nella speranza. –