在一些遗留代码中,我有很多枚举和大量的 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/