Разница между помещением переменных в заголовок и помещением переменных в источник - PullRequest
3 голосов
/ 16 апреля 2010

Скажем, я объявляю файл заголовка с переменной:

int count;

Затем в исходном файле я хочу использовать count. Должен ли я объявить это как:

extern int count

Или я могу просто использовать его в своем исходном файле? Все при условии, что у меня есть #include "someheader.h". Или я должен просто объявить это в исходном файле? В чем разница между count в заголовочном файле и исходным файлом? Или это не имеет значения?

Ответы [ 4 ]

7 голосов
/ 16 апреля 2010

Вам нужна только одна count переменная, верно? Ну вот строчка:

int count;

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

Все ключевое слово extern говорит, что в каком-то другом файле определена переменная count, и мы просто сообщаем об этом компилятору, чтобы использовать его в этом файле. Таким образом, объявление extern - это то, что вы хотите поместить в заголовок, чтобы включить его в другие файлы. Поместите определение int count; в один исходный файл.

2 голосов
/ 16 апреля 2010

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

#include "someheader.h" фактически просто копирует содержимое someheader.h in, как если бы оно было все непосредственно записано во включающий файл в тот момент.

Однако, это не способВы должны использовать заголовки.int count; является предварительным определением - вы должны помещать объявлений только в заголовочные файлы.Так что someheader.h должно иметь:

extern int count;

(что является просто декларацией), и точно один исходный файл в вашем приложении должен определить count:

int count = 0;

Остальные могут просто #include "someheader.h" и использовать count.

1 голос
/ 16 апреля 2010

Разница если что если поставить

int count;

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

В шапке нужно поставить

extern int count;

и в файле sounrce

int count;

Это приведет к объявлению глобальной переменной, доступной для всех исходных файлов, содержащих ваш заголовок. И нет ошибок переопределения.

0 голосов
/ 16 апреля 2010

Файл, который на самом деле компилируется, - это то, что выплевывает препроцессор, а не файл source.c.

Итак, если вы поместите int count; в заголовочный файл, каждый исходный файл, который #include s заголовок, получит свою собственную копию count.

В этом случае у вас будет источник, который выглядит следующим образом:

int count; 

...

extern int count; 

Если вы используете gcc, попробуйте gcc -E file.c. Это проинструктирует его запускать только препроцессор, чтобы вы могли видеть, что на самом деле подается компилятору.

Как подсказал @Neil, вы захотите объявить int count; в C-файле. Если вы хотите, чтобы другой файл C мог ссылаться на эту переменную, то вы помещаете объявление extern int count; в другой файл (или в файл заголовка, который включает другой).


Кстати, одна из моих любимых ошибок в C - это когда вы объявляете глобальную переменную, подобную этой: int count;, затем в другом файле вы объявляете другую глобальную переменную с тем же именем, но другим типом float count;. В первом файле вы говорите count = 1, и внезапно count во втором файле становится -0.0. Мораль истории? Избегайте глобальных переменных, и если вы должны их использовать, сделайте их static.

Элемент списка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...