web-dev-qa-db-ja.com

警告を修復する方法:初期化子の周りに括弧がありませんか?

警告は、valaによって生成されたcコードによって生成されます。

警告:イニシャライザの周りに括弧がない

コードは動作しますが、警告は迷惑です。警告によって参照されるvalaコードは

struct Position {uint x; uint y;}
private static Position positions[8];

生成されたCコードは

static Position det_positions[8] = {0};

半ダースの異なる方法で位置を初期化しようとしましたが、警告を満たす構文を取得できないようです。これは GCCバグ53119 ですか、それとも修正する方法はありますか?

40
jacknad

はい、これは GCCバグ53119 に関連しているようです。 C宣言を{{0}}に変更すると消滅します。オプションは次のとおりです。

  1. 警告を無視します。
  2. 生成後にCコードを操作して、sedなどを使用して、その行で{{0}}の代わりに{0}を使用します。
  3. Valaで配列externを宣言し、別の場所でC定義を記述します。 (#2の永続バージョン。)
  4. struct foo { int bar; Position positions[8]; } static foo position_holder{0}のようなことをすると、position_holder.barが初期化され、問題はなくなり、警告は消えます。
56
apmasell

この警告は、-Wallコンパイラフラグが設定された状態で、多次元配列が線形配列として扱われている場合にも表示されます(ただし、正しく、コードは完全に実行されます)。

例えば

char array[5][10][2] = {\
"0","0","0","0","0","0","0","0","0","0",\
"1","1","1","1","1","1","1","1","1","1",\
"2","2","2","2","2","2","2","2","2","2",\
"3","3","3","3","3","3","3","3","3","3",\
"4","4","4","4","4","4","4","4","4","4" };

これにより、警告が生成されます。

以下に示すように、次の変更を行って警告を削除します

char array[5][10][2] = {\
{"0","0","0","0","0","0","0","0","0","0" },\
{"1","1","1","1","1","1","1","1","1","1"},\
{"2","2","2","2","2","2","2","2","2","2"},\
{"3","3","3","3","3","3","3","3","3","3"},\
{"4","4","4","4","4","4","4","4","4","4"} };

私が間違っている場合は私を修正してください。

12
Adit Ya