为枚举变量分配超出枚举范围的值时是否会出现警告?

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

我有一个 C 函数,它使用

enum
作为参数,如下例所示:

typedef enum
{
  AB, 
  CD
} A;

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

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

是否有警告我可以启用为枚举变量分配超出枚举范围的值?

c gcc gcc-warning
3个回答
9
投票

GCC 错误数据库中有一个未解决的错误。看来GCC还没有包含这样的功能。有一个名为

-Wc++-compat
的选项,它会抱怨 - 除了无数其他事情之外,关于 any 整数被隐式转换为枚举类型。

相关功能已刚刚登陆到 GCC 存储库中。 在GCC trunk中(但在Ubuntu 19.10的编译器9.2.1中没有),有一个开关

-Wenum-conversion
,它会警告使用不相关的枚举值,但不是裸整数;即使用下面的代码它将警告后者函数调用,但不会警告前者。:

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);
      |      ^~

2
投票

即使

enum
是用户定义的类型,它也会被编译器翻译为原语,在我的例子中
int
,你可以使用以下命令检查它:

#include <stdio.h>

#define printHelloIfEnumIsInt(x) \
    _Generic(x, int: puts("Hello"));

typedef enum {
  AB, 
  CD
} A;

int main(void)
{
    printHelloIfEnumIsInt(AB);
    return 0;
}

返回:

Hello

因此

INT_MIN
...
INT_MAX
范围内的任何值都是允许的。


0
投票

我认为没有什么好的办法。但是,如果您不在枚举中使用任何

=
(如
enum foo {a=0, b=4}
),您可以这样做:

typedef enum{
  AB, 
  CD,
  A_max // Extra field that should be last
} A;

void f(A input){
    assert(input >= 0 && input < A_max);
    //  Do something
}

这是可行的,因为如果不使用

=
,第一个元素将为零,并且后面的所有元素都会为每个元素加 1。

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