webentwicklung-frage-antwort-db.com.de

gemeinsame globale Variablen in C

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 externs manuell am Anfang aller anderen C-Dateien einzufügen, die sie verwenden möchten? Das klingt nicht ideal.

76
Claudiu

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

57
DiGMi

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, den Header ein, der die externe Deklaration enthält:

#include "shared.h"

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

/* shared.cpp */
#include "shared.h"
int this_is_global;
87
Hernán

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, in der der Globale leben soll:

#define MAIN_FILE
#include "share.h"

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

#include "share.h"
22
jim mcnamara

Sie legen die Deklaration in einer Header-Datei ab, z.

 extern int my_global;

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

int my_global;

Jede .c-Datei, die Zugriff auf my_global Wünscht, enthält die Header-Datei mit dem extern in.

15
nos

Wenn Sie Code für C und C++ freigeben, müssen Sie der Datei shared.h Folgendes hinzufügen:

#ifdef __cplusplus
extern "C" {
#endif

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

#ifdef __cplusplus
}
#endif
4
tritinia

Es gibt einen saubereren Weg mit nur einer Header-Datei, so dass es einfacher zu pflegen ist. In der Kopfzeile mit dem globalen Variablenpräfix wird jede Deklaration mit einem Schlüsselwort versehen (ich verwende Common) und dann in nur einer Quelldatei wie folgt angegeben

#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, da sich der Linker sonst beschwert, 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 Deklaration zu funktionieren. Verwenden Sie nicht das allgemeine Schlüsselwort für #define.

2
ivan