如何让编译器发出有关 switch 和 case 中枚举类型不匹配的警告?

问题描述 投票:0回答:1

对于下面的代码,我希望有一个警告,因为

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 gcc clang
1个回答
0
投票

关于如何检测此类潜在错误有什么建议吗?

你不能,至少在标准 C 中不能。

enum
s 是 C 语言中的very弱抽象;它们是引入命名整数常量的一种方法,仅此而已。
enum
不会创建自己的命名空间,对于将一种
enum
类型的值分配给另一种
enum
类型的变量等没有任何限制。枚举常量属于“所有其他标识符”命名空间,所以两个不同的枚举类型不能使用相同的枚举常量。

不要期望 C 枚举类型具有与 Java 或 C# 中的枚举类型相同的类型安全性。

© www.soinside.com 2019 - 2024. All rights reserved.