c/language/extern

At the top level of a (that is, a source file with all the #includes after the preprocessor), every C program is a sequence of, which declare functions and objects with. These declarations are known as external declarations because they appear outside of any function.

Objects declared with an external declaration have static, and as such cannot use or  specifiers. The identifiers introduced by external declarations have.

Tentative definitions
A tentative definition is an external declaration without an initializer, and either without a or with the specifier.

A tentative definition is a declaration that may or may not act as a definition. If an actual external definition is found earlier or later in the same translation unit, then the tentative definition just acts as a declaration.

If there are no definitions in the same translation unit, then the tentative definition acts as an actual definition that the object.

Unlike the declarations, which don't change the linkage of an identifier if a previous declaration established it, tentative definitions may disagree in linkage with another declaration of the same identifier. If two declarations for the same identifier are in scope and have different linkage, the behavior is undefined:

A tentative definition with internal linkage must have complete type.

One definition rule
Each translation unit may have zero or one external definition of every identifier with (a  global).

If an identifier with internal linkage is used in any expression other than a, there must be one and only one external definition for that identifier in the translation unit.

The entire program may have zero or one external definition of every identifier with.

If an identifier with external linkage is used in any expression other than a, there must be one and only one external definition for that identifier somewhere in the entire program.