[英]How to check if an enum variable is valid?
我有一個枚舉:
enum myenum{
typeA,
typeB,
typeC
} myenum_t;
然后,使用enum參數調用函數:
int myfunction(myenum_t param1)
{
switch(param1)
{
case typeA:
case typeB:
case typeC:
//do the work
break;
default:
printf("Invalid parameter");
}
return 0;
}
但是,隨着myenum_t
越來越多的價值增長, myfunction
似乎並不那么優雅。
有沒有更好的方法來檢查枚舉是否有效?
一個常見的慣例是做這樣的事情:
typedef enum {
typeA,
typeB,
typeC,
num_types
} myenum_t;
然后你可以檢查(t < num_types)
。
如果您隨后添加更多枚舉,例如
typedef enum {
typeA,
typeB,
typeC,
typeD,
typeE,
num_types
} myenum_t;
然后num_types
會自動更新,您的錯誤檢查代碼無需更改。
您可以使用按位枚舉:
enum myEnum {
typeA = 1 << 0;
typeB = 1 << 1;
typeC = 1 << 2;
}
int myFunction(myEnum arg1)
{
int checkVal = typeA | typeB | typeC;
if (checkVal & arg1)
{
// do work here;
}
else
{
printf("invalid argument!");
}
return 0;
}
對不起,我覺得這個問題看錯了。
看來你想要做的是確定你是否傳入了適當的值,而不是一些隨機的無效選項。 在這種情況下,最合乎邏輯的選擇是:
if (arg1 < typeA || arg1 > typeC)
printf("invalid argument");
當然,這是假設您沒有為枚舉設置手動值,除非使用按位枚舉,否則這很少見。
是。
讓編譯器完成它的工作,不要將int
轉換為enum
類型,你應該很好。
我過去使用的一個技巧:
enum foo {FIRST_FOO, BAR, BLETCH, BLURGA, BLAH, LAST_FOO};
然后檢查您的值是否> FIRST_FOO && < LAST_FOO
1 。
當然,這假設您的枚舉值之間沒有間隙。
否則,不,沒有好的方法來做你所要求的(至少在C中)。
6.7.2.2枚舉說明符
...
3枚舉器列表中的標識符聲明為具有int
類型的常量,並且可以出現在允許的位置。 109)帶=
的枚舉數將其枚舉常量定義為常量表達式的值。 如果第一個枚舉數沒有=
,則其枚舉常量的值為0
。 具有no=
每個后續枚舉器將其枚舉常量定義為通過將1
添加到先前枚舉常量的值而獲得的常量表達式的值。 (枚舉器與=
的使用可能會產生枚舉常量,其值與同一枚舉中的其他值重復。)枚舉的枚舉數也稱為其成員。
你也不能做類似的事情
enum myEnum {typeA,typeB, typeC};
int myFunction (myEnum arg1) {
if (arg1 >= typeA && arg1 <= typeC) {
// do work here
} else {
printf("invalid argument!");
}
return 0;
}
不幸的是,沒有一種簡單的方法來實現語言級別(至少使用C
),您只需要確保只使用通過enum
定義的變量。
雖然您可以與-Werror
一起啟用以下編譯器警告-Werror
:
-Wswitch
-Wswitch-default
-Wswitch-enum
如果在交換機內部遺漏了其中一個枚舉,則會導致構建失敗。
C ++中的枚舉已經比C中的枚舉更強。
采取以下簡單程序:
#include <iostream>
enum E
{
A,
B
};
void f(E e)
{
}
int main()
{
f(1);
}
使用GCC編譯器,我將收到此錯誤:
enum.cpp: In function ‘int main()’: enum.cpp:15: error: invalid conversion from ‘int’ to ‘E’ enum.cpp:15: error: initializing argument 1 of ‘void f(E)’
因此,您可以看到已經檢查了枚舉成員。
如果您想要更強大的類型檢查,並且具有支持C ++ 11的編譯器,您可以對枚舉使用更強大的類型檢查,請參閱http://en.wikipedia.org/wiki/C%2B%2B11#Strongly_typed_enumerations 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.