2011-09-21 188 views
0

有人在網站上公佈,你怎麼會產生這樣做唯一的枚舉常量以下問題:枚舉常量

enum _EXAMPLE 
{ 
    LEFT = 'left', 
    RIGHT = 'right' 
    //etc 
}; 

忽略有效性的問題,是如何產生的數字?更具體地說,使用什麼技術?因爲我想嘗試構建一個模擬短字符串的函數。

回答

4

'left'多字符字面(2.13.2/1的C++ 03),它具有輸入int

這是實現定義什麼整數值,它實際上有。特別是,有沒有保證,'left''right'是不相等的,所以你在使用枚舉他們是在以一個失敗者的東西。

舉一個例子,不過,GCC在這裏記錄了它的行爲:http://gcc.gnu.org/onlinedocs/gcc-4.6.1/cpp/Implementation_002ddefined-behavior.html#Implementation_002ddefined-behavior

'right'有5個字符,並明確這是不可能的,每5個字符的字符串有不同的32位值。

+0

雖然它一定是一致的嗎?爲了使字符文字始終得到0-255範圍的正確值? – SSight3

+1

「一致」是什麼意思?每個C++實現必須定義和記錄多字符文字的值(這就是「實現定義」的含義),所以每次運行程序時,「left」會具有相同的值。不過,不同的編譯器可能會給出不同的值。 ''c''不是一個多字符文字,它具有'char'類型,並且等於執行字符集中小寫字母「c」的數字值。 –

+0

那麼,我假定一個字面單個字符將使用與字面多字符相同的功能? – SSight3

1

多字符常量是你通常會希望避免的事情。假設你的系統是32位體系結構的小端。在這種情況下,'left'翻譯爲:

('l')+('e'<<8)+('f'<<16)+('t'<<24) 

注意,對於它是更容易閱讀,我省略了強制轉換爲int每個字符後面。

那麼多字符常量實際上是一個整數。

我曾經使用'BM'來檢查.bmp圖像的前兩個字節,以檢查文件類型是否正確,但很快我認爲不值得多餘的幾個字符。如果你去大端系統上,或者你的int都有不同的大小等等等等,你會得到一個問題存在。更不用說惱人的編譯器警告了。

如果你有一個enum,通常有兩種情況:

案例1,你不關心枚舉值。在這種情況下,你只是讓他們成爲。第一個將變爲零,並且編譯器以增量方式填充其餘部分。

案例2,你需要一個聰明的目的這些值。在這種情況下,你需要爲你分配一個一個的目的。例如,如果你想enum你的程序的子系統,你需要啓用,禁用它們,你可以有1個變量,它是或enum的(|)值是這樣的:

enum subsystem 
{ 
    SUBSYSTEM_1 = 0x0001, 
    SUBSYSTEM_2 = 0x0002, 
    SUBSYSTEM_3 = 0x0004, 
    SUBSYSTEM_4 = 0x0008, 
    SUBSYSTEM_5 = 0x0010, 
    /* etc */ 
}; 

(有趣的事實,確實你知道C++的enum的最後一個元素之後接受額外,?)

在沒有的情況下,你會想對應'left'一個奇怪的值。如果你認爲使代碼清晰可讀,你可以確定常量的名稱(LEFT)肯定足夠。

+0

它更像是一個聰明的竅門,在後臺作爲寫入值(EG'w + b'),因此用戶可以通過賦值運算符將它傳遞給File類 - 它可以將它作爲int,long等來提取,文件名爲char數組。我試圖避免警告,因爲它們看起來難看。 – SSight3

+1

在這種情況下,您可以像第二種情況那樣定義值,並且他們可以通過'WRITE + BINARY'這個更具可讀性且語法相同的語法(注意,由於'enum'ed值的位不重疊,'+'像'|'一樣工作 – Shahbaz