Storage classes apply only to data objects and function parameters. However, storage class keywords in C are also used to affect the visibility of functions. Every data object and parameter used in a program has exactly one storage class, either assigned explicitly or by default. There are four storage classes:
auto
register
static
extern
An object's storage class determines its availability to the
linker and its storage duration. An object with
external or internal linkage, or with the storage-class specifier
static
, has static storage duration, which means
that storage for the object is reserved and initialized to 0 only
once, before main
begins execution. An object with no
linkage and without the storage-class specifier static
has automatic storage duration; for such an object, storage is
automatically allocated on entry to the block in which it is
declared, and automatically deallocated on exiting from the block.
An automatic object is not initialized.
When applied to functions, the storage-class specifier
extern
makes the function visible from
other compilation units, and the storage-class specifier
static
makes the function visible only to other
functions in the same compilation unit. For example:
static int tree(void);
The following sections describe these storage classes.
The auto
class specifies that storage for an object is
created upon entry to the block defining the object, and destroyed
when the block is exited. This class can be declared only at the
beginning of a block, such as at the beginning of a function's body.
For example:
auto int a; /* Illegal -- auto must be within a block */ main () { auto int b; /* Valid auto declaration */ for (b = 0; b < 10; b++) { auto int a = b + a; /* Valid inner block declaration */ } }
When you use an initializer with an auto
object (see
Section 4.2), the object is
initialized each time it is created. Storage is reserved for the
object whether the block containing the object is entered through
normal processing of the block or through a jump statement into the
block. However, if the block is entered through a jump statement,
initialization of the object is not guaranteed.
The auto
class is the default for objects with block
scope. Objects with the auto
class are not available to
the linker.
The register
class identifies the assigned object
as frequently used, suggesting to the compiler that the
object should be assigned a register to minimize access time.
register
is never the default class; it must be
explicitly specified.
The register
class has the same storage duration as
the auto
class; that is, storage is created for a
register
object upon entry to the block defining the
object, and destroyed when the block is exited.
The register
class is the only storage class that can
be explicitly specified for function parameters.
The DEC C compiler uses sophisticated register
allocation techniques that make the use of the register
keyword unnecessary.
The static
class specifies that space for the
identifier is maintained for the duration of the program. Static
objects are not available to the linker. Therefore, another
compilation unit can contain an identical declaration that refers
to a different object.
A static
object can be declared anywhere a declaration
may appear in the program; it does not have to be at the beginning
of a block, as with the auto
class. If a data object is
declared outside a function, it has static duration by default-it is
initialized only once at the beginning of the program.
Expressions used to initialize static
objects must
be constant expressions. If the object with static
storage duration is not explicitly initialized, every arithmetic
member of that object is initialized to 0, and every pointer
member is initialized as a null pointer constant. See Section 4.2 for more information on
initializing objects of various data types.
The extern
class is the default class for objects with
file scope. Objects outside of any function (an external definition)
receive the extern
class storage unless explicitly
assigned the static
keyword in the declaration. The
extern
class specifies the same storage duration as
static
objects, but the object or function name is
not hidden from the linker. Using the extern
keyword in a declaration results in external linkage in most cases
(see Section 2.8), and results in static
duration of the object.