比方說,我有一個枚舉。要在交換機的默認標籤中放入什麼?
enum class ShapeName : char {TRIANGLE,CIRCLE,SQUARE};
,後來我有這樣的功能:
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;
}
雖然默認標籤應永遠不會被執行,我想考慮到可能出現的潛在的bug,如果一個程序員又增加了價值'ShapeName',它不在交換機中考慮。
你會推薦我做什麼?
1.斷言
我可以用一個斷言,但我是什麼主張?
assert(false); //?
2.例外
我可以拋出一個異常,但我不認爲這是非常好的做法。我認爲異常是因爲某些環境而無法預測的運行時事件。
3.退出
我可以立即退出程序並出現錯誤。 這感覺是最好的想法,但我不確定這是否是好的做法。我認爲斷言的優勢在於,當你準備發佈程序時,你可以將它們全部關閉。然後,所有的斷言代碼將不再存在。
也許有另一種方式,我不知道。我確實使用了一個編譯器標誌,它會警告未考慮的值,但我仍然想知道其他人推薦的內容。
4.你能告訴你的編譯器警告它嗎?這是我期望的舊式枚舉的一個選項。 – 2012-04-28 02:20:53
@SteveJessop g ++ -w -Wall -Wextra -Wswitch -Wwitch-default -Wswitch -enum -std = C++ 0x -o main main.cpp 奇怪的是,我沒有得到上述代碼的警告。我添加了另一個ShapeName並擺脫了默認標籤。依然沒有! – 2012-04-28 02:30:16
大鼠。儘管如此,C++ 11的實現還沒有完成,所以我們可以活在希望之中。 – 2012-04-28 02:37:39