In meinem Code, den ich verwendet Standard-Fallback-Fälle zu schreiben wie die folgenden enthalten behauptet, mich zu schützen gegen das Vergessen Sie den Schalter für den Fall, SemantikAktiviert "default" Fallstörung Sprungtischoptimierung?
switch(mode) {
case ModeA: ... ;
case ModeB: ... ;
case .. /* many of them ... */
default: {
assert(0 && "Unknown mode!");
return ADummyValue();
}
};
ändern ich, ob die künstliche Fall- Jetzt aktualisieren fragen, Back Check Default Case wird die Jump-Table-Generationen stören? Stellen Sie sich vor, dass "ModeA" und "ModeB" usw. aufeinanderfolgend sind, damit der Compiler in eine Tabelle umgewandelt werden kann. Da der "Standard" -Fall eine tatsächliche "return" -Anweisung enthält (da die Assert im Freigabemodus verschwindet und der Compiler über eine fehlende return-Anweisung meckert), scheint es unwahrscheinlich, dass der Compiler die Standardverzweigung optimiert.
Was ist der beste Weg, damit umzugehen? Ein Freund empfahl mir, "ADummyValue" durch eine Nullzeiger-Dereferenzierung zu ersetzen, so dass der Compiler bei Vorhandensein von nicht definiertem Verhalten auslassen könnte, um vor einer fehlenden return-Anweisung zu warnen. Gibt es bessere Möglichkeiten, dies zu lösen?
die 'assert' Gegeben, ist es wahrscheinlich am besten, entweder' throw' oder 'terminate' statt' return'. –