gemeinsame globale Variablen in C.

82

Wie kann ich globale Variablen erstellen, die in C gemeinsam genutzt werden? Wenn ich es in eine Header-Datei lege, beschwert sich der Linker, dass die Variablen bereits definiert sind. Ist die einzige Möglichkeit, die Variable in einer meiner C-Dateien zu deklarieren und manuell externs oben in allen anderen C-Dateien einzufügen, die sie verwenden möchten? Das klingt nicht ideal.

Claudiu
quelle
In Ihrem eigenen Quellcode geteilt? Fügen Sie eine externe Deklaration in eine Header-Datei und eine Definition in eine andere (einzelne) Quelle ein. Diese werden natürlich von Ihren Prozessthreads geteilt. Verwenden Sie für die gemeinsame Nutzung von Daten zwischen Prozessen IPC-Mechanismen (Shared Memory, Pipes).
Hernán
1
Siehe auch Was sind externVariablen in C?
Jonathan Leffler

Antworten:

63

In die Header-Datei schreiben Sie es mit extern. Und im globalen Bereich einer der c-Dateien deklarieren Sie es ohne extern.

DiGMi
quelle
1
Können wir es stattdessen in der Header-Datei dieser * .c-Datei deklarieren?
Geremia
91

In einer Header-Datei (shared.h):

extern int this_is_global;

Fügen Sie in jede Datei, in der Sie dieses globale Symbol verwenden möchten, einen Header mit der externen Deklaration ein:

#include "shared.h"

Um mehrere Linkerdefinitionen zu vermeiden, muss nur eine Deklaration Ihres globalen Symbols in Ihren Kompilierungseinheiten vorhanden sein (z. B. shared.cpp):

/* shared.cpp */
#include "shared.h"
int this_is_global;
Hernán
quelle
Haben Sie bevorzugte Referenzen, um mehr über IPC-Mechanismen zu erfahren?
NickO
7
Bitte legen Sie mehr Wert auf "nur eine Deklaration Ihres globalen Symbols ...". Ich hatte die Deklaration für alle c-Dateien, für die ich die globalen Variablen verwenden wollte :(
AntonioCS
22

In der Header-Datei

Header-Datei

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

In der Datei mit der Datei, die der Globale leben soll:

#define MAIN_FILE
#include "share.h"

In den anderen Dateien, die die externe Version benötigen:

#include "share.h"
Jim Mcnamara
quelle
Ah, das ist die Lösung, die ich vor einiger Zeit hatte - ich habe die Präprozessorvariable MAIN_FILE vergessen. Ich denke, ich mag die Antwort akzeptiert mehr als
Claudiu
15

Sie fügen die Deklaration in eine Header-Datei ein, z

 extern int my_global;

In einer Ihrer .c-Dateien definieren Sie sie im globalen Bereich.

int my_global;

Jede .c-Datei, auf my_globaldie zugegriffen werden soll, enthält die Header-Datei mit dem Eingang extern.

nr
quelle
5

Wenn Sie Code zwischen C und C ++ freigeben, müssen Sie der shared.hDatei Folgendes hinzufügen :

#ifdef __cplusplus
extern "C" {
#endif

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

#ifdef __cplusplus
}
#endif
Tritinia
quelle
2

Es gibt einen saubereren Weg mit nur einer Header-Datei, so dass die Wartung einfacher ist. In der Kopfzeile mit den globalen Variablen wird jeder Deklaration ein Schlüsselwort vorangestellt (ich verwende common) und dann in nur einer Quelldatei wie folgt eingefügt

#define common
#include "globals.h"
#undef common

und alle anderen Quelldateien wie diese

#define common extern
#include "globals.h"
#undef common

Stellen Sie nur sicher, dass Sie keine der Variablen in der Datei globals.h initialisieren. Andernfalls beschwert sich der Linker weiterhin, da eine initialisierte Variable auch mit dem Schlüsselwort extern nicht als extern behandelt wird. Die Datei global.h sieht ähnlich aus

#pragma once
common int globala;
common int globalb;
etc.

scheint für jede Art von Erklärung zu funktionieren. Verwenden Sie das allgemeine Schlüsselwort natürlich nicht für #define.

ivan
quelle