2012-05-16 13 views
6

今日私は以前開発したプロジェクトでclangを試みました。私はg ++を使ってプロジェクトを正常にコンパイルしていたので、コンパイルエラーが発生したときに驚いていました。このエラーが発生しgで__attribute__を使用しているアンバランスな括弧

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

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

はあなたが見ることができるように、umbalanced括弧があり

この短いスニペットは、エラーが発生しましたラインを再現します。 3つの '('と2 ')'があります。これは、実際にコンパイルエラーが発生するはずです。

これはこのキーワードの有効な使用方法ですか?私はそれがそうであることを示すthe documentationに何かを見つけるように見えることができません。

私はg ++ 4.5.2とclang 2.8を使用しています。

g ++の代わりにgccを使用すると、このエラーが検出されることに注意してください。

+0

[gcc documentation](http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html)* "キーワード' __attribute__'では、変数や構造体フィールドの特殊属性を指定できます。 *このキーワードの後ろには二重括弧 "***の中の属性指定が続きます。同じ括弧数で閉じることについての明確な明示的な言葉では言いませんが、すべてのgccの例は括弧を一致させるので、バグのようです。 –

+0

はい、実際にはバグのようです。私は反対を示すことができる何かを見つけることができません。 – mfontanini

+0

@DavidRodríguez-dribeas clangがサポートしています。つまり、g ++がそのexpereionを正確に解析していないように見えます。 clangは正しいことをしています(少なくとも私はそう思っています...それが私が求めている理由です:D)ここでエラーを報告してください。 – mfontanini

答えて

3

これはコンパイラのバグです。コンパイラは、__attribute__の後に2つの開始括弧、いくつかの他のトークン、次に2つの閉じ括弧を表示します。おそらく“の定義”です。__attribute__のようになります。

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

私の推測では、間にトークンがaligned(16として、それはまだ動作し、いくつかの奇跡によって解釈されていることです。

+0

パーフェクトこれはgccのbugzillaのバグとして報告されたばかりだよ。 – mfontanini

+0

はい、 – mfontanini

+2

バグではないかもしれませんが、私の目では、不均衡なカッコがほとんどあなたの望むものではないので、それはありません。これは、 GCCが '((' 'と'))の中に何らかのトークンを出現させることができれば、それはバグとはみなされないかもしれません。 – dreamlax

関連する問題