Search code examples
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

  • No, an empty initializer list is not allowed. 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.