我正在审查很多类似这样的代码
typedef enum {
OPTION1
OPTION2
} option_t
...
void a_function(option_t option){
if(option == OPTION1){
...
} else if(option == OPTION2){
...
} else {
// report an error!
// can we ever get here?
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,else需要报告错误的子句吗?在我看来, asoption类型是一个只有两种可能性的枚举,除了and之外option_t不应该option有任何值,因此该子句应该不可能被执行。OPTION1OPTION2else
枚举在类型安全方面没有太多的作用,并且通常会因类型设计而被破坏(截至今天,即将推出的 C23 将改变许多 C 语言缺陷)。在您的示例中OPTION1, 是 类型int并且option_t是某种足够大以适合枚举列表中的所有值的整数类型,不一定是int。
我的问题是,是否需要报告错误的else子句?
这就是所谓的“防御性编程”。理论上,枚举不应该有任何其他值。实际上,没有什么可以阻止您为其分配任何整数值。或者,如果出现内存损坏错误,也没有什么可以阻止该错误将其更改为另一个值。
所以这取决于你的要求。对于商业/业余爱好者/PC 要求,else可能不需要。对于安全相关、关键任务或类似软件(例如 MISRA C 合规性),这else是必需的并且是良好实践。
相关文章:如何创建类型安全枚举?