enum SomeEnum
{
DD,
PP,
NN
};
void someFunc(int a)
{
}
int main()
{
SomeEnum e = DD;
someFunc(a) // calls someFunc with value 0
return 0;
}
這個工作在MSVC但它是非標準?
由於
enum SomeEnum
{
DD,
PP,
NN
};
void someFunc(int a)
{
}
int main()
{
SomeEnum e = DD;
someFunc(a) // calls someFunc with value 0
return 0;
}
這個工作在MSVC但它是非標準?
由於
一種enum
具有底層整數類型(用於存儲enum
的值的類型),並且enum
值可以隱式轉換到整數類型的值。
在你的情況下,基礎類型爲int
,值爲0.一切都沒問題。
枚舉器列表中的標識符被聲明爲具有int類型的常量,並且可以出現在允許的任何位置。
6.7.2.2這裏http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
這是絕對有效的,因爲,作爲GManNickG和西紅柿說,所有枚舉都是int類型(事實上,在C,Enum也整數,你可以將它們的範圍值枚舉。
typedef enum _foo
{
val1 = 57
} foo;
...
foo f = 99; // compiles in C but not C++
事實上,因爲枚舉充當恆定整數值像0,-1,200,等等大多數編譯器不會抱怨,如果該函數的參數類型是布爾或浮動或其他原語類型數...
我在說什麼, ð雖然說的是,如果你有超過someFunc的簽名控制,你想++,以確保用C沒有無效的值傳遞中,將其更改爲
void someFunc(SomeEnum a);
更多類型安全
而且,總是至少初始化您的第一枚枚舉值。我可能是錯的,但是,在當天,編譯器被允許爲你的枚舉選擇一個任意的起始值。大多數時候它選擇0但不總是。即使情況並非如此,它會使代碼變得更加自我記錄並且顯而易見。
我沒有說他們都是'int',我說他們是整型。根據枚舉器中的值,它們可能是'unsigned','(unsigned)long'或'(unsigned)long long'。 – GManNickG
請注意,在C++ 11中,這僅適用於無限制枚舉。對於範圍枚舉('enum class'),沒有隱式轉換爲整型。 –