对于下面的代码,我希望有一个警告,因为
a
是类型enum A
,但是case B1
和B2
是类型enum B
;但我找不到一种方法让 gcc/clang 发出警告。
关于如何检测此类潜在错误有什么建议吗?
谢谢
enum A { A1, A2 };
enum B { B1, B2 };
int foo(enum A a) {
switch(a) {
case B1:
return 1;
case B2:
return 2;
default:
return 3;
}
}
$ clang -Wall -Wextra -Wpedantic -Werror -c enum3.c; echo $?
0
$ gcc -Wall -Wextra -Wpedantic -Werror -c enum3.c; echo $?
0
$ clang --version
Ubuntu clang version 14.0.0-1ubuntu1.1
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
$ gcc --version
gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
关于如何检测此类潜在错误有什么建议吗?
你不能,至少在标准 C 中不能。
enum
s 是 C 语言中的very弱抽象;它们是引入命名整数常量的一种方法,仅此而已。 enum
不会创建自己的命名空间,对于将一种 enum
类型的值分配给另一种 enum
类型的变量等没有任何限制。枚举常量属于“所有其他标识符”命名空间,所以两个不同的枚举类型不能使用相同的枚举常量。
不要期望 C 枚举类型具有与 Java 或 C# 中的枚举类型相同的类型安全性。