2014-01-25 86 views
0

我知道枚舉類型實現取決於枚舉器的值,編譯器選擇一個可以表示所有枚舉器值的類型,在下面的例子中我不知道爲什麼example1沒有編譯,而example2編譯好嗎?
在C++中實現枚舉器

注:
這個大數字不只是一個隨機數,這也正是pow(2,63),我不能沒有使用它,因爲普查員只能與整型常量表達式進行初始化。
9223372036854775808 = pow(2,63)



example1.1:

enum A{a=9223372036854775808,b=-1}; 

cout << sizeof(a) << endl; 

錯誤:沒有積分類型可以表示爲 '主():: A' 所有的枚舉值的

example1.2:

enum A{a=9223372036854775808,b=-9223372036854775807}; 

cout << sizeof(a) << endl; 

b=-(pow(2,63) - 1)
這也給了我同樣的錯誤,沒有整型都可以代表A中的所有枚舉值


例2:

enum A{a=9223372036854775808,b=-9223372036854775808}; 

cout << sizeof(a) << endl; // prints 8 

這個編譯沒有任何e (a)的大小爲8。


對上述行爲有解釋嗎?


更新:
如果使用Coliru編譯上面的代碼,它編譯沒有錯誤,因爲它有一個完整的類型,它是16個字節長,所以改變a價值pow(2,127)-1b-1會再次出現相同的錯誤。爲了避免混淆,讓我們堅持使用32位機器爲了這個例子,在線編譯器使用Ideone

我的問題很清楚,爲什麼它的工作原理是b=-9223372036854775808,而不是如果b=-1

UPDATE2:

注意例題c++11 comipler)不編譯使用C++ 11,這在我看來是做了順理成章的事情。但在C++ 03 example2c++03 compiler)編譯得很好,但example1不能編譯。

+0

在example2中'b'截斷,還是真的是'-9223372036854775808'? – woolstar

+0

@woolstar我找不到有關「b」值是否被截斷的任何信息。我更新了我的問題,我用C++ 11測試了這個問題,它不編譯'example1'和'example2',我認爲這是正確的行爲。 在c + + 03'example2'編譯好,我不知道爲什麼。 – AlexDan

回答

1

我的錯誤是在C++ 11模式下編譯,因此無法重現錯誤。但現在,我切換到C++03 mode,我可以重現的問題和錯誤是不同的:

main.cpp:5:10: warning: integer constant is too large for its type [enabled by default] 

enum A{a=170141183460469231731687303715884105727,b=-1}; 

     ^

main.cpp:5:1: warning: this decimal constant is unsigned only in ISO C90 [enabled by default] 

enum A{a=170141183460469231731687303715884105727,b=-1}; 

^ 

main.cpp:5:1: warning: integer constant is too large for 'long' type [-Wlong-long] 

main.cpp:5:54: error: no integral type can represent all of the enumerator values for 'A' 

enum A{a=170141183460469231731687303715884105727,b=-1}; 

                ^

main.cpp:5:8: warning: large integer implicitly truncated to unsigned type [-Woverflow] 

enum A{a=170141183460469231731687303715884105727,b=-1}; 

看看最後一個。如果它被截斷爲一個無符號類型,那說明存在編譯器錯誤(因爲b是-1)。例如#2,截斷doesn't seem to happen

+0

查看我的更新,我知道它對Coliru有效,因爲這是一個不同的機器,如果將'a'的值更改爲pow(2,127)-1,http:// coliru,它將具有相同的行爲。 stacked-crooked.com/a/7a00e30f52e91378 – AlexDan

+0

@AlexDan也許它在C++ 11中有所不同?我不認爲它與機器有關,而是你編譯的是什麼標準模式。 – 2014-01-25 06:44:08

+0

我沒有使用C++ 11,它是C++ 4.8 – AlexDan