Tha называется предварительным определением.Это разрешено только в C.
Предварительное определение - это любое объявление внешних данных, которое не имеет спецификатора класса хранения и не имеет инициализатора. Предварительное определение становится полным определением, если конецединица перевода достигнута, и не было найдено никакого определения с инициализатором для идентификатора.В этой ситуации компилятор резервирует неинициализированное пространство для определенного объекта.
Следующие операторы показывают нормальные определения и предварительные определения.
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 ++ делаетне поддерживает концепцию предварительного определения: объявление внешних данных без спецификатора класса хранения всегда является определением.
Отсюда: Предварительные определения