c - 将整数分配给枚举时如何收到警告?

标签 c gcc enums clang warnings

有没有办法让 Clang 或 GCC 在将普通整数分配给枚举类型的变量时发出警告?这个问题涉及的是C,而不是C++。

示例:

typedef enum foo_e { A=1, B=2 } foo_t;

foo_t fun() {
    foo_t x = A; // this is fine
    foo_t y = 2; // should trigger a warning
    int z = B;   // this is fine
    return 1;    // should trigger a warning, as the return type is foo_t
}

“经典”英特尔编译器针对这些情况发出警告:警告#188,“枚举类型与另一种类型混合”。这揭示了我们代码中的几个真正的错误。然而,这是一个由志愿者运行的开源项目,我们无法定期使用这个非自由编译器进行测试,也无法将其集成到 CI 管道中。看到这些检查的值(value)后,我想知道是否有办法通过 Clang 或 GCC 获取它们。

最佳答案

检查the GCC warning documentation没有显示符合您要求的选项。

有一些选项可以解决 switch 语句中缺少枚举值的情况(-Wswitch-Wswitch-enum),以及不同枚举值之间的比较类型(-Wenum-compare),以及不同枚举类型之间的转换(-Wenum-conversion)。

编译器开发人员可能认为有关将 int 值分配给枚举类型的左值的警告不会有用,因为它会警告普通所需的分配,例如 i = i+1 中:

for (enum weather i = sunny; i <= rain; i = i+1)
    …

其中,i+1 是一个 int,因为 1 是一个 int 并且 1 的操作数是 + 转换为通用类型,然后将这个 int 分配给 enumweather i

有一些kludges to use enumerations with some type safety .

关于c - 将整数分配给枚举时如何收到警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73342454/

相关文章:

c - 字符串比较中的十六进制文字问题

c - 为什么我的代码退出时退出代码为 : 0 even though the loop condition is still valid?

C++ 警告 : division of double by zero

swift - 如何将枚举大小写传递到使用 'if case' 检查属性大小写的函数中

java - 检索枚举的注释值

c++ - 获取 unicode 代码点的大写或小写(如 uint32_t)

c++ - 用于从 FORTRAN 代码调用的 C++ 函数调用 C++ 代码的 Cmake 配置文件

gcc - “make install”compains libstdc++.so.6 没有 GLIBCXX_3.4.15,但我在 LD_LIBRARY_PATH 中有 libstdc++.so.6 文件

java - 如我的代码示例所示,将应用程序常量放置是正确的方法吗?

objective-c - cocoa 项目中从不兼容类型 "MyPrivateData *"错误分配给 'void *'