在 switch 中捕获混合枚举

标签 c enums

在一些遗留代码中,我有很多枚举和大量的 switch case。我想测试开关是否具有纯枚举类型。废话例子:

typedef enum EN
{
    EN_0,
    EN_1
} EN_T;

typedef enum DK
{
    DK_0,
    DK_1
} DK_T;

EN_T bar = ...
switch( bar )
{
    case EN_0:
    ...
    break;
    case DK_1: //<-- mixed type
    ...
    break;
}

我尝试用 gcc with -Wall -Wextra -pedantic 编译它,并且没有收到任何警告。关于如何测试这个的任何想法?作为编译器警告或专用测试代码。由于开关和枚举都有 100 多个成员,因此它必须在某种程度上是通用的。

编辑:请注意,根据 C 标准,我不关心这是否合法。

这是不好的做法,编译器可以警告不违反标准的坏做法或潜在错误,例如 if( a = 1)...永远是真实的,完全合法但可能是错误的。

如果枚举上的开关不包含该枚举的所有值,我可以让编译器发出警告。

如果编译器可以完成这项工作是首选,但如果像 lint 或类似的工具可以做到这一点,我也会很高兴。

最佳答案

不,您不能将 switch case 标签限制为特定 enum 的显式值。 (出于对 C++11 的兴趣,您可以使用 C++)。

如果您能够更改 enum 值以使它们不相交,那可能会对您有所帮助,但仅限于运行时。

关于在 switch 中捕获混合枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48277085/

相关文章:

enums - 如何将 CLI 参数限制为枚举?

c - 在project.exe : 0xC0000005: Access violation writing location 0x007110E8 中的0x5409B211 (ucrtbased.dll)处抛出异常

javascript - 在浏览器中运行 C

c - 函数内的 malloc char*,valgrind 报告内存泄漏

java - 不要在枚举字段内排序

java - 如何在数据库中对 (Java) 枚举进行建模(使用 SQL92)

c - K&R p188 中给出的 free 函数实际上释放了之前分配的内存吗?

c - 为什么我的编译守卫不能阻止多重定义包含?

java - 是否可以迭代多个枚举类?

powershell - 按索引引用 ENUM