The static and extern tags on file-scoped variables determine whether they are accessible in other translation units (i.e. other .c or .cpp files).
-
staticgives the variable internal linkage, hiding it from other translation units. However, variables with internal linkage can be defined in multiple translation units. -
externgives the variable external linkage, making it visible to other translation units. Typically this means that the variable must only be defined in one translation unit.
The default (when you don’t specify static or extern) is one of those areas in which C and C++ differ.
-
In C, file-scoped variables are
extern(external linkage) by default. If you’re using C,VALisstaticandANOTHER_VALisextern. -
In C++, file-scoped variables are
static(internal linkage) by default if they areconst, andexternby default if they are not. If you’re using C++, bothVALandANOTHER_VALarestatic.
From a draft of the C specification:
6.2.2 Linkages of identifiers
…
-5- If the declaration of an identifier for a function has no storage-class specifier, its linkage
is determined exactly as if it were declared with the storage-class specifier extern. If
the declaration of an identifier for an object has file scope and no storage-class specifier,
its linkage is external.
From a draft of the C++ specification:
7.1.1 – Storage class specifiers [dcl.stc]
…
-6- A name declared in a namespace scope without a storage-class-specifier has external linkage unless it has internal linkage because of a previous declaration and provided it is not declared const. Objects declared const and not explicitly declared extern have internal linkage.