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

82

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

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

Ответы:

64

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

DiGMi
источник
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.

иван
источник