C typedef 枚举的值可以大于枚举中的元素数量吗?

ACa*_*ter 2 c enums

我正在审查很多类似这样的代码

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

Lun*_*din 6

枚举在类型安全方面没有太多的作用,并且通常会因类型设计而被破坏(截至今天,即将推出的 C23 将改变许多 C 语言缺陷)。在您的示例中OPTION1, 是 类型int并且option_t是某种足够大以适合枚举列表中的所有值的整数类型,不一定是int

我的问题是,是否需要报告错误的else子句?

这就是所谓的“防御性编程”。理论上,枚举不应该有任何其他值。实际上,没有什么可以阻止您为其分配任何整数值。或者,如果出现内存损坏错误,也没有什么可以阻止该错误将其更改为另一个值。

所以这取决于你的要求。对于商业/业余爱好者/PC 要求,else可能不需要。对于安全相关、关键任务或类似软件(例如 MISRA C 合规性),这else是必需的并且是良好实践。

相关文章:如何创建类型安全枚举?