有人在網站上公佈,你怎麼會產生這樣做唯一的枚舉常量以下問題:枚舉常量
enum _EXAMPLE
{
LEFT = 'left',
RIGHT = 'right'
//etc
};
忽略有效性的問題,是如何產生的數字?更具體地說,使用什麼技術?因爲我想嘗試構建一個模擬短字符串的函數。
有人在網站上公佈,你怎麼會產生這樣做唯一的枚舉常量以下問題:枚舉常量
enum _EXAMPLE
{
LEFT = 'left',
RIGHT = 'right'
//etc
};
忽略有效性的問題,是如何產生的數字?更具體地說,使用什麼技術?因爲我想嘗試構建一個模擬短字符串的函數。
'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位值。
多字符常量是你通常會希望避免的事情。假設你的系統是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-255範圍的正確值? – SSight3
「一致」是什麼意思?每個C++實現必須定義和記錄多字符文字的值(這就是「實現定義」的含義),所以每次運行程序時,「left」會具有相同的值。不過,不同的編譯器可能會給出不同的值。 ''c''不是一個多字符文字,它具有'char'類型,並且等於執行字符集中小寫字母「c」的數字值。 –
那麼,我假定一個字面單個字符將使用與字面多字符相同的功能? – SSight3