如何修复警告:初始化器周围缺少括号?

jac*_*nad 42 gcc vala

警告由vala生成的c代码生成.

警告:初始化程序周围缺少大括号

代码有效但警告很烦人.警告引用的vala代码是

struct Position {uint x; uint y;}
private static Position positions[8];
Run Code Online (Sandbox Code Playgroud)

生成的C代码是

static Position det_positions[8] = {0};
Run Code Online (Sandbox Code Playgroud)

我已经尝试了六种不同方式初始化位置,但似乎无法获得满足警告的语法.这是GCC的错误53119还是有办法解决它?

apm*_*ell 58

是的,这似乎与GCC错误53119有关.如果你将C声明更改为,它就会消失{{0}}.你的选择是:

  1. 忽略警告.
  2. 在生成之后操纵C代码{{0}}而不是{0}在该行上使用sed等.
  3. extern在Vala中声明数组,并在其他地方编写C定义.(#2的永久版本.)
  4. 这样做struct foo { int bar; Position positions[8]; } static foo position_holder{0}将被初始化position_holder.bar这是罚款和警告消失.

  • 或者在编译中添加"-Wno-missing-braces"以使无效警告静音. (11认同)
  • 但请注意,警告通常无效!只是为了零初始化(即``= {0}``),它总是无效的.有关警告的有效案例,请参阅[Adit Ya的答案](http://stackoverflow.com/a/21873585/490560). (2认同)

Adi*_* Ya 14

当多维数组被设置为-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" };
Run Code Online (Sandbox Code Playgroud)

这将生成警告.

执行以下更改以删除警告,如下所示

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"} };
Run Code Online (Sandbox Code Playgroud)

如果我错了,请纠正我.