2010-04-26 41 views
3

LLVM的萬花筒剖析器/ AST示例中,枚舉被賦予所有負值。爲什麼減號? 使用負枚舉的優點

enum Token { 
    tok_eof = -1, 
    // commands 
    tok_def = -2, tok_extern = -3, 
    // primary 
    tok_identifier = -4, tok_number = -5 
};

回答

3

帶枚舉的常見C語言習慣是使用負值來表示一組條件和正值來表示另一組。例如,來自解析器的錯誤條件可能是全部正值,而正常條件具有全部負值,並且可能爲零是「未定義」的情況。因此,在您的代碼中,對任何錯誤進行測試都如同tok >= 0一樣簡單。

+0

事實上,例如說: //詞法分析器返回令牌[0-255],如果它是未知字符,已知事物的這些否則之一。 ..所以在這種情況下,正數將是標識符(在關鍵字等編譯器中不會是「已知事物」)。 – 2011-02-01 11:51:43

2

我相信這些負值的用法只是表示代碼中特殊標記的一種方式。

在示例代碼中,有效令牌從0到255,因此超出此範圍的任何值都可以用於特殊令牌,如tok_eof。因此,因爲0到255不能用於枚舉,所以他們選擇使用負值,儘管他們可能已經使用了256,257,258等等。負值看起來比256,257,258 IMO更具原創性。