c - 为枚举变量分配一个超出枚举范围的值时是否有警告?

标签 c gcc gcc-warning

我有一个使用 enum 作为参数的 C 函数,如下例所示:

typedef enum
{
  AB, 
  CD
} A;

void f(A input)
{
  // do something
}

int main(void)
{
   // do something
   f(-10);
   // do something
}

如果我可以启用一个警告来分配一个值超出枚举范围的枚举变量?

最佳答案

有一个open bug for it在 GCC 错误数据库中。 GCC 似乎还没有包含这样的功能。有一个名为 -Wc++-compat 的选项会提示 - 在无数其他事情中,关于 any 整数被隐式转换为枚举类型。

一项相关功能刚刚进入了 GCC 存储库。 在 GCC 主干中(但不在 9.2.1 中,它是 Ubuntu 19.10 的编译器),有一个开关 -Wenum-conversion,它会警告使用不相关的枚举值,但不会警告裸整数;即使用以下代码 it will warn about the latter function call, but not the former. :

typedef enum{ AB, CD } A;

typedef enum{ EF, GH } B;

void f(A input){
    (void)input;
}

int main(void){
    f(-10);
    f(GH);
}

使用-Wenum-conversion 进行编译的诊断将是

<source>: In function 'main':
<source>:18:6: warning: implicit conversion from 'enum <anonymous>' to 'A' [-Wenum-conversion]
   18 |    f(GH);
      |      ^~

关于c - 为枚举变量分配一个超出枚举范围的值时是否有警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59880944/

相关文章:

c connect() 错误 - 参数无效

c - 复合语句( block )是否被 ANSI C 中的括号表达式包围?

将 GNU case 范围扩展转换为标准 C

c++ - 成功启用NaN移除方法上的-fno-finite-math-only

gcc - qsort_s 位于 Windows 的 MingGW (gcc 4.8) 中的哪个 header 中?

c++ - 不明白 "assuming signed overflow"警告

c - BMP{FileHeader, InfoHeader} 结构的问题

我可以在没有键盘的情况下访问标准输入吗?

c - 终端输出不是逻辑分析仪得到的

c - 问题将缓冲区转换为 c 中的十六进制字符串