I am attempting to understand the underlying mechanics of how C handles complex typedefs, from a syntax perspective.
Consider the following examples below (references in
Simplfying KepaniHaole's rules a bit, it boils down to:
()
and []
bind before *
. Thus, T *a[]
is an array of pointer tp T
, T (*a)[]
is a pointer to an array of T
, T *f()
is a function returning a pointer to T
, , and T (*f)()
is a pointer to a function returning T
.
Taking an example that gives a lot of people heartburn, we can look at the prototype for the POSIX signal
function:
void (*signal( int sig, void (*func)( int )))( int );
which reads as
signal -- signal
signal( ) -- is a function with
signal( sig ) -- parameter sig
signal( int sig ) -- of type int
signal( int sig, func ) -- and parameter func
signal( int sig, (*func) ) -- of type pointer to
signal( int sig, (*func)( )) -- a function with
signal( int sig, (*func)( int )) -- an int parameter
signal( int sig, void (*func)( int )) -- returning void
(*signal( int sig, void (*func)( int ))) -- returning a pointer to
(*signal( int sig, void (*func)( int )))( ) -- a function with
(*signal( int sig, void (*func)( int )))( int ) -- an int parameter
void (*signal( int sig, void (*func)( int )))( int ) -- returning void