A tentative definition is any external data declaration that has
no storage class specifier and no initializer. A tentative definition
becomes a full definition if the end of the translation unit is reached and no
definition has appeared with an initializer for the identifier. In this
situation, the compiler reserves uninitialized space for the object
defined.
The following statements show normal definitions and tentative definitions.
int i1 = 10; /* definition, external linkage */ static int i2 = 20; /* definition, internal linkage */ extern int i3 = 30; /* definition, external linkage */ int i4; /* tentative definition, external linkage */ static int i5; /* tentative definition, internal linkage */ int i1; /* valid tentative definition */ int i2; /* not legal, linkage disagreement with previous */ int i3; /* valid tentative definition */ int i4; /* valid tentative definition */ int i5; /* not legal, linkage disagreement with previous */
C++ does not support the concept of a tentative definition: an
external data declaration without a storage class specifier is always a
definition.
Related References