An object may be declared auto only within a function. It has block scope and the defined object has automatic storage duration.
A register declaration is equivalent to an auto declaration. It also advises the compiler that the object will be accessed frequently. It is not possible to take the address of a register object.
static gives a declared object static storage duration.
The object may be defined inside or outside functions. An identifier declared static with file scope has internal linkage. A function may be declared or defined with static. If a function is defined to be static, the function has internal linkage. A function may be declared with static at block scope; the function should be defined with static as well.
extern gives a declared object static storage duration. An object or function declared with extern has the same linkage as any visible declaration of the identifier at file scope. If no file scope declaration is visible the identifier has external linkage.
Using typedef as a storage class specifier does not reserve storage. Instead, typedef defines an identifier that names a type. See the section on derived types for a discussion of typedef.