cgccstructstandardsinitializer

Is an empty initializer list valid C code?


It is common to use {0} to initialize a struct or an array but consider the case when the first field isn't a scalar type. If the first field of struct Person is another struct or array, then this line will result in an error (error: missing braces around initializer).

struct Person person = {0};

At least GCC allows me to use an empty initializer list to accomplish the same thing

struct Person person = {};

But is this valid C code?

Also: Is this line guaranteed to give the same behavior, i.e. a zero-initialized struct?

struct Person person;

Solution

  • An empty initializer list is not allowed before C23. This can also be shown by GCC when compiling with -std=c99 -pedantic:

    a.c:4: warning: ISO C forbids empty initializer braces
    

    The reason is the way the grammar is defined in §6.7.9 of the 2011 ISO C Standard:

    initializer:
             assignment-expression
             { initializer-list }
             { initializer-list , }
    initializer-list:
             designation(opt) initializer
             initializer-list , designation(opt) initializer
    

    According to that definition, an initializer-list must contain at least one initializer.

    The N2900 proposal added the empty initializer list to the language, and was included in the C23 standard revision. The grammar now reads (in C23 §6.7.11):

    braced-initializer:
             { }
             { initializer-list }
             { initializer-list , }