typedef definitions

A typedef declaration lets you define your own identifiers that can be used in place of type specifiers such as int, float, and double. A typedef declaration does not reserve storage. The names you define using typedef are not new data types, but synonyms for the data types or combinations of data types they represent.

The name space for a typedef name is the same as other identifiers. When an object is defined using a typedef identifier, the properties of the defined object are exactly the same as if the object were defined by explicitly listing the data type associated with the identifier.

IBM extension
typedef definitions are extended to handle vector types, provided that vector support is enabled. A vector type can be used in a typedef definition, and the new type name can be used in the usual ways, except for declaring other vectors. In a vector declaration context, a typedef name is disallowed as a type specifier. The following example illustrates a typical usage of typedef with vector types:
typedef vector unsigned short vint16;
vint16 v1;
End IBM extension

Examples of typedef definitions

The following statements define LENGTH as a synonym for int and then use this typedef to declare length, width, and height as integer variables:
typedef int LENGTH;
LENGTH length, width, height;
The preceding declarations are equivalent to the following declaration:
int length, width, height;
Similarly, typedef can be used to define a structure, union, or C++ class. For example:
typedef struct {
                int scruples;
                int drams;
                int grains;
               } WEIGHT;
The structure WEIGHT can then be used in the following declarations:
WEIGHT  chicken, cow, horse, whale;
In the following example, the type of yds is "pointer to function with no parameters, returning int".
typedef int SCROLL(void);
extern SCROLL *yds; 
In the following typedef definitions, the token struct is part of the type name: the type of ex1 is struct a; the type of ex2 is struct b.
typedef struct a { char x; } ex1, *ptr1;
typedef struct b { char x; } ex2, *ptr2;  
Type ex1 is compatible with the type struct a and the type of the object pointed to by ptr1. Type ex1 is not compatible with char, ex2, or struct b.

Begin C++ only
In C++, a typedef name must be different from any class type name declared within the same scope. If the typedef name is the same as a class type name, it can only be so if that typedef is a synonym of the class name.

A C++ class defined in a typedef definition without being named is given a dummy name.Such a class cannot have constructors or destructors. Consider the following example:
typedef class {
               ~Trees();
              } Trees;
In this example, an unnamed class is defined in a typedef definition. Trees is an alias for the unnamed class, but not the class type name. So you cannot define a destructor ~Trees() for this unnamed class; otherwise, the compiler issues an error.
End C++ only
Begin C++0x only

Declaring typedef names as friends

In the C++0x standard, the extended friend declarations feature is introduced, with which you can declare typedef names as friends. For more information, see Extended friend declarations

End C++0x