У меня есть заголовочный файл, который выглядит как
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, отсутствующая в последующих выпусках стандарта.