wspólne zmienne globalne w C

82

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ć externs na początku wszystkich innych plików C, które chcą jej użyć? To nie brzmi idealnie.

Claudiu
źródło
Udostępnione we własnym kodzie źródłowym? Umieść deklarację extern w jednym pliku nagłówkowym, a definicję w innym (pojedynczym) źródle. Są one oczywiście dzielone między wątkami procesu. Do wymiany danych między procesami należy używać mechanizmów IPC (pamięć współdzielona, ​​potoki).
Hernán
1
Zobacz także Czym są externzmienne w C?
Jonathan Leffler

Odpowiedzi:

64

W pliku nagłówkowym zapisz go z extern. W globalnym zakresie jednego z plików c zadeklaruj go bez extern.

DiGMi
źródło
1
Czy możemy zamiast tego zadeklarować to w pliku nagłówkowym tego pliku * .c?
Geremia
91

W jednym pliku nagłówkowym (shared.h):

W każdym pliku, którego chcesz użyć tego globalnego symbolu, umieść nagłówek zawierający deklarację extern:

Aby uniknąć wielu definicji konsolidatora, tylko jedna deklaracja symbolu globalnego musi być obecna w jednostkach kompilacji (np .: shared.cpp):

Hernán
źródło
czy masz jakieś preferowane referencje, aby dowiedzieć się więcej o mechanizmach IPC?
NickO,
7
Proszę położyć większy nacisk na „tylko jedną deklarację waszego globalnego symbolu…” Trochę się potknęłam o ten jeden. Miałem deklarację dotyczącą wszystkich plików c, na których chciałem użyć zmiennych globalnych :(
AntonioCS
22

W pliku nagłówkowym

plik nagłówkowy

W pliku z plikiem, który chcesz umieścić globalnie:

W innych plikach, które wymagają wersji zewnętrznej:

jim mcnamara
źródło
ah to jest rozwiązanie, które miałem jakiś czas temu - zapomniałem o zmiennej preprocesora MAIN_FILE. Myślę, że podoba mi się, że kurs zaakceptował odpowiedź bardziej niż
Claudiu
15

Deklarację umieszczasz w pliku nagłówkowym np

W jednym ze swoich plików .c definiujesz go w zakresie globalnym.

Każdy plik .c, do którego chce uzyskać dostęp, my_globalzawiera plik nagłówkowy z rozszerzeniem externin.

nr
źródło
5

Jeśli udostępniasz kod między C i C ++, pamiętaj, aby dodać do shared.hpliku:

tritinia
źródło
2

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

i wszelkie inne pliki źródłowe, takie jak ten

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

wydaje się działać dla każdego typu deklaracji. Oczywiście nie używaj wspólnego słowa kluczowego na #define.

ivan
źródło