On Wed, 27 Nov 2013 17:13:08 +0100 Ingo Molnar <[email protected]> wrote:
> > * Steven Rostedt <[email protected]> wrote: > > > On Wed, 27 Nov 2013 16:46:00 +0100 > > Ingo Molnar <[email protected]> wrote: > > > > > > > > * Peter Zijlstra <[email protected]> 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'. Yeah, I misread it. I was reading the array section for awhile, and got confused. > > That's what compiler legalese brings you ;-) Yep. > > > 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? Well, because it's mixing arrays and structures, and I was on the misconception that the paragraph was talking about just arrays. Can I just have my turkey now? -- Steve -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

