The extern storage class specifier lets you declare objects that several source files can use. An extern declaration makes the described variable usable by the succeeding part of the current source file. This declaration does not replace the definition. The declaration is used to describe the variable that is externally defined.
An extern declaration can appear outside a function or at the beginning of a block. If the declaration describes a function or appears outside a function and describes an object with external linkage, the keyword extern is optional.
If a declaration for an identifier already exists at file scope, any extern declaration of the same identifier found within a block refers to that same object. If no other declaration for the identifier exists at file scope, the identifier has external linkage.
C++ restricts the use of the extern storage
class specifier to the names of objects or functions. Using the extern specifier
with type declarations is illegal. An extern declaration
cannot appear in class scope.
All extern objects have static storage duration. Memory is allocated for extern objects before the main function begins running, and is freed when the program terminates. The scope of the variable depends on the location of the declaration in the program text. If the declaration appears within a block, the variable has block scope; otherwise, it has file scope.
Like the scope,
the linkage of a variable declared extern depends
on the placement of the declaration in the program text. If the variable
declaration appears outside of any function definition and has been
declared static earlier in the file, the variable
has internal linkage; otherwise, it has external linkage in most cases.
All object declarations that occur outside a function and that do
not contain a storage class specifier declare identifiers with external
linkage.
For objects in the unnamed namespace,
the linkage may be external, but the name is unique, and so from the
perspective of other translation units, the name effectively has internal
linkage.
The keyword extern was
previously used as a storage specifier or as part of a linkage specification.
The C++0x standard adds a third usage to use this keyword to specify
explicit instantiation declarations. For more information, see Explicit instantiation (C++ only).