* Steven Rostedt <rost...@goodmis.org> wrote: > On Wed, 27 Nov 2013 16:46:00 +0100 > Ingo Molnar <mi...@kernel.org> wrote: > > > > > * Peter Zijlstra <pet...@infradead.org> wrote: > > > > > On Wed, Nov 27, 2013 at 04:35:19PM +0100, Ingo Molnar wrote: > > > > So why does GCC then behave like this: > > > > > > I think because its a much saner behaviour; also it might still be the > > > spec actually says this, its a somewhat opaque text. > > > > > > Anyway, yes GCC seems to behave as we 'expect' it to; I just can't find > > > the language spec actually guaranteeing this. > > > > So from C99 standard ยง6.7.8 (Initialization)/21: > > > > "If there are fewer initializers in a brace-enclosed list than > > there are elements or members of an aggregate, or fewer characters > > in a string literal used to initialize an array of known size than > > there are elements in the array, the remainder of the aggregate > > shall be initialized implicitly the same as objects that have static > > storage duration." > > > > static initialization == zeroing in this case. > > > > The confusion here is that the above looks to be talking about arrays. > But it really doesn't specify structures.
It talks about neither 'arrays' nor 'structures', it talks about 'aggregates' - which is defined as _both_: 'structures and arrays'. That's what compiler legalese brings you ;-) > But searching the internet, it looks as though most people believe > it applies to structures, and any compiler that does otherwise will > most likely break applications. > > That is, this looks to be one of the gray areas that the compiler > writers just happen to do what's most sane. And they probably assume > it's talking about structures as well, hence the lack of warnings. I don't think it's grey, I think it's pretty well specified. > It gets confusing, as the doc also shows: > > struct { int a[3], b; } w[] = { { 1 }, 2 }; I don't think this is valid syntax, I think this needs one more set of braces: struct { int a[3], b; } w[] = { { { 1 }, 2 } }; > Then points out that w.a[0] is 1 and w.b[0] is 2, and all other > elements are zero. If by 'w.a[0]' you mean 'w[0].a[0]', and if by 'w.b[0]' you mean 'w[0].b' then yes, this comes from the definition and it's what I'd call 'obvious' initialization behavior. What makes it confusing to you? Thanks, Ingo -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/