общие глобальные переменные в C - PullRequest
76 голосов
/ 10 июня 2010

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

Ответы [ 6 ]

87 голосов
/ 10 июня 2010

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

extern int this_is_global;

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

#include "shared.h"

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

/* shared.cpp */
#include "shared.h"
int this_is_global;
57 голосов
/ 10 июня 2010

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

22 голосов
/ 10 июня 2010

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

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

#ifndef SHAREFILE_INCLUDED
#define SHAREFILE_INCLUDED
#ifdef  MAIN_FILE
int global;
#else
extern int global;
#endif
#endif

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

#define MAIN_FILE
#include "share.h"

В других файлахчто нужно extern версия:

#include "share.h"
15 голосов
/ 10 июня 2010

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

 extern int my_global;

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

int my_global;

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

4 голосов
/ 06 июня 2013

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

#ifdef __cplusplus
extern "C" {
#endif

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

#ifdef __cplusplus
}
#endif
2 голосов
/ 01 февраля 2017

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

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

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