Странное предупреждение GCC о classе и типе хранения

У меня есть заголовочный файл, который выглядит как

header.h

int TOS; 

Этот файл включается только одним файлом кода

code.c

 #include "header.h" TOS=0; 

При компиляции code.c GCC выдает предупреждение

code.c: 3: 1: предупреждение: определение данных не имеет типа или classа хранения [включено по умолчанию] code.c: 3: 1: warning: type defaults to ‘int’ в объявлении ‘TOS’ [включено по умолчанию]

Я не понимаю причины этого предупреждения. Разве это не эквивалентно объявлению и определению TOS в code.c? т.е.

code.c

 int TOS; TOS=0; 

Это связано с тем, что вы определяете TOS в глобальной области, в которой вам нужно определить тип TOS (это объявление), если не указан тип, по умолчанию это int .

Это вызовет conflicting type error ,

 char x; x = 0; 

Правильный способ перенаправления переменной в файл заголовка будет

 extern int TOS; 

без extern это могло бы привести к тому, что TOS выделяется в нескольких единицах компиляции (файлы .o).

Затем вы даете определение в одном .c файле как

 int TOS; 

Тогда это зарезервировало бы пространство для него, и поскольку это переменная в глобальной области видимости, она также инициализирует ее равной 0 . Если вы хотите сделать эту инициализацию явной или если вы хотите, чтобы это было другое значение, чем 0 , правильный синтаксис для инициализации (а не назначения )

 int TOS = 54; 

Современный C не позволяет синтаксис, который вы, кажется, унаследовали откуда-то, а именно определение глобальной переменной с неявным типом int .

TOS=0 не является назначением, это объявление с инициализатором (т. Е. Определение). int TOS; это предварительное определение с внешней связью. Когда компоновщик соединяет несколько единиц перевода вместе, он сворачивает соответствующий объект (= память для переменной). Как сказано в другом месте, тип int по умолчанию – это функция C89, отсутствующая в последующих выпусках стандарта.