In a declaration whose storage-class specifier is
typedef , each declarator defines a
typedef name that specifies an alias for the stated
type. A typedef declaration does not introduce a
new type, but only introduces a synonym for the stated type. For
example:
typedef int integral_type; integral_type x;
In the previous example, integral_type is defined
as a synonym for int , and so the following
declaration of x declares x to be of type
int . Type definitions are useful in cases where a long
type name (such as some forms of structures or unions) benefits from
abbreviation, and in cases where the interpretation of the type can
be made easier through a type definition.
A typedef name shares the same name space as other
identifiers in ordinary declarators. If an object is redeclared in
an inner scope, or is declared as a member of a structure or union
in the same or inner scope, the type specifiers cannot be omitted
from the inner declaration. For example:
typedef signed int t;
typedef int plain;
struct tag {
   unsigned t:4;
   const t:5;
   plain r:5;
};
It is evident that such constructions are obscure. The previous
example declares a typedef name t
with type signed int , a typedef name
plain with type int , and a structure
with three bit-field members, one named t , another
unnamed member, and a third member named r . The first
two bit-field declarations differ in that unsigned
is a type specifier, which forces t to be the name of
a structure member by the rule previously given. The second bit-
field declaration includes const , a type qualifier,
which only qualifies the still-visible typedef name
t .
The following example shows additional uses of the
typedef keyword:
typedef int miles, klicksp(void);
typedef struct { double re, im; } complex;
   .
   .
   .
miles distance;
extern klicksp *metricp;
complex x;
complex z, *zp;
All of the code shown in the previous example is valid. The
type of distance is int , the type of
metricp is a pointer to a function with no parameters
returning int , and the type of x and
z is the specified structure. zp is a
pointer to the structure.
It is important to note that any type qualifiers used with a
typedef name become part of the type definition. If
the typedef name is later qualified with the same type
qualifier, an illegal construction results. For example:
typedef const int x; const x y; /* Illegal -- duplicate qualifier used */