我将问题解释为询问GCC是否正确接受指定类型的对象的指定初始化程序。为了解决这个问题,我将引用C2011标准的6.7.9节。
首先,以下既适用于初始化为整体结构,并内的第一构件的初始化:
[...]的初始值设定为一个对象,其具有聚合或联合类型应是元素或命名成员的初始化符的大括号包含列表。
我们则有:
每个括号内的初始化列表中有相关的当前对象。当前对象的子对象按照 的顺序初始化为当前对象的类型:数组元素以下标顺序递增,结构成员以声明顺序[...]。
......后来......
如果聚集或联合包含的元素或成员是聚集或工会,这些规则递归适用于subaggregates或包含工会。如果子集或包含的联合的初始化器以左大括号开始,那么大括号和其右括号所包含的初始化器将初始化子集或包含的联合的元素或成员。
在这些,我们已经建立了作为一个初始化整个结构的整体{{{{0}}}}
,{{{0}}}
作为其第一个成员,a
一个初始化,并{{0}}
作为a[0]
的初始化。问题归结为最后的配对是否有效。如果是,那么其他人也是有效的。
这可能带有对此事:
为标量的初始化应是一个单一的表达,任选包含在括号。
(强调增加)。这可以解释为指定a[0]
的初始值设定项可以用大括号括起来,即{0}
,因为a[0]
确实是一个标量。我不相信这就是预期的解释,但我现在不会准备好接受GCC的过错。
但是,我不接受{{0}}
作为大括号中的单个表达式,因此我不接受它是a[0]
的有效初始值设定项。我推测 GCC接受它作为规则的不适当的递归应用的结果,允许标量初始化器被大括号包围。
对于它的价值,GCC 4.4.7并默认发出关于构建两个警告:
i.c:7: warning: braces around scalar initializer
i.c:7: warning: (near initialization for ‘tmp.a[0]’)
i.c:7: warning: braces around scalar initializer
i.c:7: warning: (near initialization for ‘tmp.a[0]’)
显然,然后,有人认为额外的括号是有问题的,但海湾合作委员会的文件没有提到接受这在支持的语言扩展中形成。那么,至少有一个文档错误。
MSVC说“太多初始化程序”,并且在'struct'定义之后留下了语法错误no';'。 –
@WeatherVane gcc,只需修复它;) – Serge
您可以通过'gcc --version'确切确定哪个版本的gcc。 –