Странное GCC предупреждение о классе и типе хранилища - PullRequest
0 голосов
/ 09 октября 2011

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

header.h

int TOS;

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

code.c

#include "header.h"
TOS=0;

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

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

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

code.c

int TOS;
TOS=0;

Ответы [ 3 ]

2 голосов
/ 09 октября 2011

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

extern int TOS;

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

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

int TOS;

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

int TOS = 54;

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

2 голосов
/ 09 октября 2011

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

Это приведет к conflicting type error,

char x;
x = 0;
0 голосов
/ 09 октября 2011

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

...