Well, this is what the C99 final public draft says (don't have an official version):
Code:
6.7.8 Initialization Syntax
initializer:
assignment-expression
{ initializer-list }
{ initializer-list , }
initializer-list:
designation[opt] initializer
initializer-list , designation[opt] initializer
So initializer-list consists of at least a single initializer, and initializer in its list form needs an initializer-list between the braces. So yeah, the grammar requires at least one initializer.
To contrast, here's the equivalent section of the latest C++0x draft (I do have a C++03 official standard somewhere, but can't find it right now):
Code:
8.5 Initializers [dcl.init]
[...]
initializer:
brace-or-equal-initializer
( expression-list )
brace-or-equal-initializer:
= initializer-clause
braced-init-list
initializer-clause:
assignment-expression
braced-init-list
initializer-list:
initializer-clause ...opt
initializer-list , initializer-clause ...opt
braced-init-list:
{ initializer-list ,opt }
{ }
The empty braces are an explicit addition to the grammar.