Declarations
Certain declarations can use incomplete types,
but others require (complete) object types.
Those declarations that require object types are
array elements,
members of structures or unions,
and objects local to a function.
All other declarations permit incomplete types.
In particular, the following are permitted:
Note that since array and function parameter types are rewritten to be pointer types, a seemingly incomplete array parameter type is not actually incomplete. The typical declaration of main's argv (namely, char *argv[]) as an unspecified length array of character pointers, is rewritten to be a pointer to character pointers.