[英]Is there a warning for assigning an enum variable with a value out of the range of the enum?
我有一個使用enum
作為參數的 C 函數,如下例所示:
typedef enum
{
AB,
CD
} A;
void f(A input)
{
// do something
}
int main(void)
{
// do something
f(-10);
// do something
}
是否有一個警告,我可以啟用分配值超出枚舉范圍的枚舉變量?
在 GCC 錯誤數據庫中有一個開放的錯誤。 似乎 GCC 還沒有包含這樣的功能。 有一個名為-Wc++-compat
的選項,它會抱怨 - 在無數其他事情中,關於任何整數被隱式轉換為枚舉類型。
一個相關的功能剛剛登陸 GCC 存儲庫。 在 GCC 主干中(但不是在 9.2.1 中,它是 Ubuntu 19.10 的編譯器),有一個開關-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 中使用任何=
像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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.