2012-05-16 31 views
6

今天我試了一下我之前開發的一個項目。當它遇到一個編譯錯誤時我感到驚訝,因爲我已經使用g ++成功編譯了我的項目。g ++中使用__attribute__的不平衡括號

這一小段再現那裏遇到錯誤的行:

int main() { 
    __attribute__((aligned(16)) char arr[5]; 
} 

將會產生這個錯誤:

test.cpp:2:32: error: expected ')' 
    __attribute__((aligned(16)) char arr[5]; 
          ^
           ) 

正如你可以看到,有一個umbalanced括號。有三個'('和兩個')'。這顯然看起來應該會產生編譯錯誤。

這是該關鍵字的有效用法嗎?我似乎無法找到the documentation上顯示的任何內容。

我使用g ++ 4.5.2和clang 2.8。

請注意,使用gcc而不是g ++檢測到此錯誤。

+0

[gcc文檔](http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html)指出*「關鍵字'__attribute__'允許您指定變量或結構字段的特殊屬性。* *這個關鍵字後面跟着一個在雙括號「***」內部的屬性說明,所以它沒有用明確的關於相同括號數的關鍵詞來說明,但所有的gcc示例都顯示了匹配的括號,因此看起來像一個錯誤。 –

+0

是的,它看起來實際上是一個錯誤。我找不到任何可能表明相反的東西。 – mfontanini

+0

@DavidRodríguez-dribeas clang支持它。我的意思是,它真的看起來像g ++不正確解析expresion。鏗鏘做正確的事情(至少我懷疑是這樣的...這就是爲什麼我問:D)在這裏報告錯誤時。 – mfontanini

回答

3

這將是一個編譯器錯誤。編譯器看到__attribute__後面跟着兩個開括號,一些其他的標記,然後是兩個最後的括號,這可能是應該看起來像__attribute__的「定義」。

<attribute> ::= __attribute__ '((' something '))'

我的猜測是,在之間的令牌被解釋爲aligned(16,奇妙它仍然有效。

+0

完美我剛剛報告過這是gcc bugzilla的錯誤 – mfontanini

+0

是的,因爲'__attribute __((packed)'does not compile。 – mfontanini

+2

這可能不是一個錯誤,在我看來,這是因爲不平衡的括號幾乎不是你想要的,但是如果GCC允許任何類型的標記出現在'(('和'))'內,那麼它可能不被視爲一個bug。試試'__attribute __(((((())''看看是否抱怨未知屬性而不是不平衡括號 – dreamlax