Jak mogę tworzyć zmienne globalne, które są współdzielone w C? Jeśli umieszczę go w pliku nagłówkowym, wówczas konsolidator narzeka, że zmienne są już zdefiniowane. Czy to jedyny sposób, aby zadeklarować zmienną w jednym z moich plików C i ręcznie wstawić extern
s na początku wszystkich innych plików C, które chcą jej użyć? To nie brzmi idealnie.
82
extern
zmienne w C?Odpowiedzi:
W pliku nagłówkowym zapisz go z
extern
. W globalnym zakresie jednego z plików c zadeklaruj go bezextern
.źródło
W jednym pliku nagłówkowym (shared.h):
extern int this_is_global;
W każdym pliku, którego chcesz użyć tego globalnego symbolu, umieść nagłówek zawierający deklarację extern:
#include "shared.h"
Aby uniknąć wielu definicji konsolidatora, tylko jedna deklaracja symbolu globalnego musi być obecna w jednostkach kompilacji (np .: shared.cpp):
/* shared.cpp */ #include "shared.h" int this_is_global;
źródło
W pliku nagłówkowym
plik nagłówkowy
#ifndef SHAREFILE_INCLUDED #define SHAREFILE_INCLUDED #ifdef MAIN_FILE int global; #else extern int global; #endif #endif
W pliku z plikiem, który chcesz umieścić globalnie:
#define MAIN_FILE #include "share.h"
W innych plikach, które wymagają wersji zewnętrznej:
#include "share.h"
źródło
Deklarację umieszczasz w pliku nagłówkowym np
extern int my_global;
W jednym ze swoich plików .c definiujesz go w zakresie globalnym.
int my_global;
Każdy plik .c, do którego chce uzyskać dostęp,
my_global
zawiera plik nagłówkowy z rozszerzeniemextern
in.źródło
Jeśli udostępniasz kod między C i C ++, pamiętaj, aby dodać do
shared.h
pliku:#ifdef __cplusplus extern "C" { #endif extern int my_global; /* other extern declarations ... */ #ifdef __cplusplus } #endif
źródło
Jest bardziej przejrzysty sposób z tylko jednym plikiem nagłówkowym, więc jest łatwiejszy w utrzymaniu. W nagłówku ze zmiennymi globalnymi poprzedzaj każdą deklarację słowem kluczowym (używam wspólnego), a następnie w jednym pliku źródłowym umieść to w ten sposób
#define common #include "globals.h" #undef common
i wszelkie inne pliki źródłowe, takie jak ten
#define common extern #include "globals.h" #undef common
Po prostu upewnij się, że nie zainicjowałeś żadnej ze zmiennych w pliku globals.h, w przeciwnym razie konsolidator nadal będzie narzekał, ponieważ zainicjowana zmienna nie jest traktowana jako zewnętrzna, nawet przy użyciu słowa kluczowego extern. Plik global.h wygląda podobnie do tego
#pragma once common int globala; common int globalb; etc.
wydaje się działać dla każdego typu deklaracji. Oczywiście nie używaj wspólnego słowa kluczowego na #define.
źródło