我有一个 C 函数,它使用
enum
作为参数,如下例所示:
typedef enum
{
AB,
CD
} A;
void f(A input)
{
// do something
}
int main(void)
{
// do something
f(-10);
// do something
}
是否有警告我可以启用为枚举变量分配超出枚举范围的值?
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);
| ^~
即使
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
范围内的任何值都是允许的。
我认为没有什么好的办法。但是,如果您不在枚举中使用任何
=
(如 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。