Tre*_*key 10 c++ assert default switch-statement
假设我有一个枚举.
enum class ShapeName : char {TRIANGLE,CIRCLE,SQUARE};
Run Code Online (Sandbox Code Playgroud)
后来我有这样的功能:
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;
}
Run Code Online (Sandbox Code Playgroud)
虽然永远不应该执行默认标签,但我想说明如果程序员在"ShapeName"中添加另一个值并且在交换机中没有考虑到可能会出现的错误.
你会建议我做什么?
1.断言
我可以使用断言,但我断言的是什么?
assert(false); //?
Run Code Online (Sandbox Code Playgroud)
2.例外
我可以抛出异常,但我认为这不是一个很好的做法.我的印象是异常是针对某些环境无法预测的运行时事件.
3.退出
我可以立即退出程序并出错.这感觉就像最好的主意,但我不确定这是不错的做法.我认为断言的优点是,当你准备好运送程序时,你可以将它们全部关掉.然后,所有断言代码将不再存在.
也许还有另一种我不知道的方式.我确实使用了一个编译器标志来警告未计入的值,但我仍然想知道别人推荐的是什么.
我喜欢用信息性的信息断言的想法.试试这个:
assert (!"The default case of so-so switch was reached.");
Run Code Online (Sandbox Code Playgroud)
这始终返回false,但会提供您可以使用的消息.
编辑:
我找到了源头,我把这个概念从我的记忆中拉出来; 它出现在下面的书中:
C++编码标准 - 101规则和指南