общие глобальные переменные в C


82

Как я могу создать глобальные переменные, которые используются в C? Если я помещаю его в файл заголовка, компоновщик жалуется, что переменные уже определены. Это единственный способ объявить переменную в одном из моих файлов C и вручную поместить externs вверху всех других файлов C, которые хотят ее использовать? Звучит не идеально.


Совместно с вашим собственным исходным кодом? Поместите объявление extern в один файл заголовка, а определение в другой (единственный) источник. Конечно, они распределяются между потоками вашего процесса. Для межпроцессного обмена данными используйте механизмы IPC (разделяемая память, каналы).
Hernán



Ответы:


64

В заголовочном файле напишите его с помощью extern. И в глобальной области видимости одного из файлов c объявите его без extern.


1
Можем ли мы вместо этого объявить его в заголовочном файле * .c файла?
Geremia

91

В одном заголовочном файле (shared.h):

В каждый файл, в котором вы хотите использовать этот глобальный символ, включите заголовок, содержащий объявление extern:

Чтобы избежать множественных определений компоновщика, только одно объявление вашего глобального символа должно присутствовать в ваших единицах компиляции (например, shared.cpp):


есть ли у вас какие-либо предпочтительные ссылки, чтобы узнать больше о механизмах IPC?
NickO

7
Пожалуйста, сделайте больший акцент на «всего лишь одно объявление вашего глобального символа ...» Вроде споткнулся об этом. У меня было объявление для всех c-файлов, в которых я хотел использовать глобальные переменные :(
AntonioCS

22

В заголовочном файле

заголовочный файл

В файле с файлом вы хотите, чтобы глобал жил:

В других файлах, которым нужна внешняя версия:


ах, это решение, которое у меня было некоторое время назад - я забыл о переменной препроцессора MAIN_FILE. Мне кажется, мне больше нравится этот пёс, принятый ответ
Claudiu

15

Вы помещаете объявление в файл заголовка, например

В одном из ваших файлов .c вы определяете его в глобальном масштабе.

Каждый файл .c, к которому требуется доступ, my_globalвключает файл заголовка с расширением extern.


5

Если вы разделяете код между C и C ++, не забудьте добавить в shared.hфайл следующее:


2

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

и любые другие исходные файлы, подобные этому

Просто убедитесь, что вы не инициализируете какие-либо переменные в файле globals.h, иначе компоновщик все равно будет жаловаться, поскольку инициализированная переменная не рассматривается как внешняя даже с ключевым словом extern. Файл global.h выглядит примерно так

похоже, работает для любого типа объявления. Разумеется, не используйте общее ключевое слово в #define.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.