Global variables in C are static or not?
Solution 1:
If you do not specify a storage class (that is, the extern
or static
keywords), then by default global variables have external linkage. From the C99 standard:
§6.2.2 Linkages of identifiers
3) If the declaration of a file scope identifier for an object or a function contains the storage-class specifier
static
, the identifier has internal linkage.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.
So even if you don't specify the extern
keyword, globals can still be accessed by other source files (so-called translation units), because they can still have an extern
declaration for the same variable. If you use the static
keyword to specify internal linkage, then even in the presence of an extern
declaration for the same variable name in another source file, it will refer to a different variable.
Solution 2:
In C, a global variable which doesn't have an initializer or any storage class specifiers is a tentative definition of a variable with static storage duration and external linkage.
In a translation unit all tentative definitions and up to one non-tentative definition (e.g. from a declaration with an initializer) are collapsed into a single definition for a variable. Although it's not allowed to have a definition of the same variable in multiple translation units it is a common extension to allow "common" variables, i.e. tentative definitions of the same variable in multiple translation units.