> Date: Sat, 07 Aug 2021 22:59:02 +0700 > From: Robert Elz <k...@munnari.oz.au> > > Date: Wed, 4 Aug 2021 17:52:46 -0700 > From: Jason Thorpe <thor...@me.com> > Message-ID: <68ff8737-f347-4a7f-960b-9e4a6ca9e...@me.com> > > | It addresses the concerns about compile-time type checking > | by using an anonymous structure constructed in-line > > Is there something in the C definition of such things which guarantees > that the un-init'd fields all get set to 0/NULL ? Or is that just > happening because of the "const" spread all over - which might be causing > the compiler to allocate static storage, but which is not required of const? > > Also, is there some way to distinguish an integer valued attribute which > is explicitly set to 0 from one which isn't set at all (in which case we > might want to default it to some other value) or do we only ever use > attributes via various kinds of pointers (or perhaps never have any, > anywhere ever, where 0 is a sensible value) ?
C11, Sec. 6.7.9 `Initialization', paragraph 19, p. 141: `The initialization shall occur in initializer list order, each initializer provided for a particular subobject overriding any previously listed initializer for the same subobject; all subobjects that are not initialized explicitly shall be initialized implicitly the same as objects that have static storage duration.' And paragraph 10, p. 140: `....If an object that has static or thread storage duration is not initialized explicitly, then: `--- if it has pointer type, it is initialized to a null pointer; `--- if it has arithmetic tpye, it is initialized to (positive or unsigned) zero; `--- if it is an aggregate, every member is initialized (recursively) according to these rules, and any padding is initialized to zero bits; `--- if it is a union, the first named member is initialized (recursively) according to these rules, and any padding is initialized to zero bits.' So pointers are nulled and integers are zero'd here -- and const is not relevant, nor does the storage for these objects actually have static duration; it's just that the anonymous struct objects with designated initializers are initialized the same way as if they did have static storage duration.