Как я могу создать глобальные переменные, которые используются в C? Если я помещаю его в файл заголовка, компоновщик жалуется, что переменные уже определены. Это единственный способ объявить переменную в одном из моих файлов C и вручную поместить extern
s вверху всех других файлов C, которые хотят ее использовать? Звучит не идеально.
82
extern
переменные в C?Ответы:
В заголовочном файле напишите его с помощью
extern
. И в глобальной области видимости одного из файлов c объявите его безextern
.источник
В одном заголовочном файле (shared.h):
extern int this_is_global;
В каждый файл, в котором вы хотите использовать этот глобальный символ, включите заголовок, содержащий объявление extern:
#include "shared.h"
Чтобы избежать множественных определений компоновщика, только одно объявление вашего глобального символа должно присутствовать в ваших единицах компиляции (например, shared.cpp):
/* shared.cpp */ #include "shared.h" int this_is_global;
источник
В заголовочном файле
заголовочный файл
#ifndef SHAREFILE_INCLUDED #define SHAREFILE_INCLUDED #ifdef MAIN_FILE int global; #else extern int global; #endif #endif
В файле с файлом вы хотите, чтобы глобал жил:
#define MAIN_FILE #include "share.h"
В других файлах, которым нужна внешняя версия:
#include "share.h"
источник
Вы помещаете объявление в файл заголовка, например
extern int my_global;
В одном из ваших файлов .c вы определяете его в глобальном масштабе.
int my_global;
Каждый файл .c, к которому требуется доступ,
my_global
включает файл заголовка с расширениемextern
.источник
Если вы разделяете код между C и C ++, не забудьте добавить в
shared.h
файл следующее:#ifdef __cplusplus extern "C" { #endif extern int my_global; /* other extern declarations ... */ #ifdef __cplusplus } #endif
источник
Есть более чистый способ с одним файлом заголовка, который проще в обслуживании. В заголовке с префиксом глобальных переменных каждое объявление с ключевым словом (я использую общий), тогда только в один исходный файл включите его следующим образом
#define common #include "globals.h" #undef common
и любые другие исходные файлы, подобные этому
#define common extern #include "globals.h" #undef common
Просто убедитесь, что вы не инициализируете какие-либо переменные в файле globals.h, иначе компоновщик все равно будет жаловаться, поскольку инициализированная переменная не рассматривается как внешняя даже с ключевым словом extern. Файл global.h выглядит примерно так
#pragma once common int globala; common int globalb; etc.
похоже, работает для любого типа объявления. Разумеется, не используйте общее ключевое слово в #define.
источник