2014-02-18 114 views
0

我有以下標誌枚舉定義(使用可可宏):枚舉值定義裏面的逗號?

typedef NS_OPTIONS(uint64_t, ItemDataType) { 

... 

    A = (1 << 16), 
    B = (1 << 17), 
    C = (1 << 18), 
... 

    G = (1 << 31), 

    TEST = (A | B | C, G) 
}; 

TEST應該是(A | B | C | G),但我們做了一個錯字,進入(A | B | C, G)。這個符號是什麼意思? TEST的實際值是多少?這不是一個編譯器錯誤嗎?

回答

4

,comma operator,它是有效的代碼,它將評估左邊的操作數,然後丟棄值並計算右邊的操作數,這就是結果。

從C99標準牽伸部6.5.17逗號運算符段落:

逗號操作者的左操作數被評價爲空隙表達;評估後有一個 序列點。然後評估右操作數;結果有它的 類型和值。 97)

另外值得一提的是,逗號操作具有lowest operator precedence

clang用,如果你使用-Weverything標誌提供以下警告:

warning: expression is not an integer constant expression; folding it to a constant is a GNU extension [-Wgnu-folding-constant] 
TEST = (A | B | C , G) 
     ^~~~~~~~~~~~~~~ 

這是正確的值必須是一個常量表達式,它不是,因爲常量表達式不能包含逗號操作符。

warning: left-hand operand of comma expression has no effect [-Wunused-value] 
TEST = (A | B | C , G) 
       ^
error: enumerator value for 'TEST' is not an integer constant 
+0

的關鍵是括號:

gcc在這種情況下,如果我使用-Wall標誌給了我一個錯誤,但也警告。如果沒有括號,那麼它會存儲'A |的值B | C',但就目前而言,它存儲'G'的值。逗號運算符具有任何C運算符的最低優先級,並充當序列點。 – Brian

+0

你能否提供一個真實世界的例子,這個操作符將被用在像這樣的上下文中?編譯器至少應該發出警告。 –

+1

@LeoNatan:爲什麼要發出警告?會(a + = 2,b + = 3);發出警告?如果這是預期的效果呢? – Brian