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

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

Ответ 1

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

Ответ 2

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

extern int this_is_global;

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

#include "shared.h"

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

/* shared.cpp */
#include "shared.h"
int this_is_global;

Ответ 3

В файле заголовка

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

#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"

Ответ 4

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

 extern int my_global;

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

int my_global;

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

Ответ 5

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

#ifdef __cplusplus
extern "C" {
#endif

extern int my_global;
/* other extern declarations ... */

#ifdef __cplusplus
}
#endif

Ответ 6

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

#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, конечно.