6.40. Incomplete enumTypes
You can define an enum tag without specifying its possible values.
This results in an incomplete type, much like what you get if you write
struct foo without describing the elements. A later declaration
which does specify the possible values completes the type.
You can't allocate variables or storage using the type while it is
incomplete. However, you can work with pointers to that type.
This extension may not be very useful, but it makes the handling of
enum more consistent with the way struct and union
This extension is not supported by GNU C++.