From §6.2.7.5 (page 66):
EXAMPLE Given the following two file scope declarations:
int f(int (*)(), double (*)[3]); int f(int (*)(char
I would intuitively understand the phrase "composite type" as meaning "structures and unions", which appears to be way off-target.
In the C language definition, arrays and structs are aggregate types (types composed of multiple elements). Unions are kind of their own animal, since they can only take on the value of one element at a time.
Composite types are more of an issue for compiler implementors, rather than us run-of-the-mill code monkeys. You and I would not attempt to define a composite type, or declare objects of that type.
In the example given, you have two file scope declarations for a function f
that are slightly different from each other. Based on the rules presented in 6.2.7/3, the compiler determines a type that works for both, such that it can enforce type semantics at compile time (i.e., any calls to f
can be properly checked, even with the slightly different declarations) and generate the proper machine code to call the function.