【发布时间】:2012-04-28 02:18:43
【问题描述】:
假设我有一个枚举。
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;
}
虽然不应执行默认标签,但我想说明如果程序员向“ShapeName”添加另一个值并且未在切换中考虑的情况下可能出现的潜在错误。
会发生什么你推荐我做?
1.断言
我可以使用断言,但我在断言什么?
assert(false); //?
2。例外情况
我可以抛出异常,但我认为这不是很好的做法。我的印象是,由于某些环境而无法预测的运行时事件会出现异常。
3.退出
我可以立即退出程序并出现错误。
这感觉是最好的主意,但我不确定这是否是好的做法。我认为断言的优点是你可以在准备好发布程序时将它们全部关闭。然后,所有的断言代码都将不复存在。
也许还有另一种我不知道的方式。我确实使用了一个编译器标志来警告未解释的值,但我仍然想知道其他人推荐什么。
【问题讨论】:
-
4.你能告诉你的编译器警告它吗?这是我期望旧式枚举的一个选项。
-
@SteveJessop g++ -w -Wall -Wextra -Wswitch -Wswitch-default -Wswitch-enum -std=c++0x -o main main.cpp 奇怪,我没有收到警告全部用上面的代码。我添加了另一个 ShapeName 并摆脱了默认标签。还是什么都没有!
-
老鼠。不过,C++11 的实现还没有完成,所以我们可以满怀希望。
标签: c++ default switch-statement assert