gedeelde globale variabelen in C

Hoe kan ik globale variabelen maken die in C worden gedeeld? Als ik het in een headerbestand plaats, klaagt de linker dat de variabelen al zijn gedefinieerd. Is de enige manier om de variabele in een van mijn C-bestanden te declareren en handmatig externs in te voeren boven aan alle andere C-bestanden die deze willen gebruiken? Dat klinkt niet ideaal.


Antwoord 1, autoriteit 100%

In één headerbestand (shared.h):

extern int this_is_global;

In elk bestand dat u dit globale symbool wilt gebruiken, moet u de koptekst opnemen die de externe declaratie bevat:

#include "shared.h"

Om meerdere linkerdefinities te vermijden, er moet slechts één declaratie van uw globale symbool aanwezig zijn in uw compilatie-eenheden(bijvoorbeeld: shared.cpp):

/* shared.cpp */
#include "shared.h"
int this_is_global;

Antwoord 2, autoriteit 73%

Schrijf het in het headerbestand met extern.
En op het globale bereik van een van de c-bestanden declareer je het zonder extern.


Antwoord 3, autoriteit 24%

In het headerbestand

headerbestand

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

In het bestand met het bestand waarvan u wilt dat het globale leven:

#define MAIN_FILE
#include "share.h"

In de andere bestanden die de externe versie nodig hebben:

#include "share.h"

Antwoord 4, autoriteit 16%

U plaatst de aangifte in een headerbestand, bijv.

extern int my_global;

In een van uw .c-bestanden definieert u het op globale schaal.

int my_global;

Elk .c-bestand dat toegang wil tot my_globalbevat het headerbestand met de externerin.


Antwoord 5, autoriteit 6%

Als je code deelt tussen C en C++, vergeet dan niet om het volgende toe te voegen aan het shared.hbestand:

#ifdef __cplusplus
extern "C" {
#endif
extern int my_global;
/* other extern declarations ... */
#ifdef __cplusplus
}
#endif

Antwoord 6, autoriteit 2%

Er is een schonere manier met slechts één headerbestand, dus het is eenvoudiger te onderhouden.
In de header met de globale variabelen laat elke declaratie voorafgaan met een trefwoord (ik gebruik common) en voeg het dan in slechts één bronbestand als volgt toe

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

en alle andere bronbestanden zoals deze

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

Zorg er wel voor dat u geen van de variabelen in het globals.h-bestand initialiseert, anders zal de linker nog steeds klagen omdat een geïnitialiseerde variabele niet als extern wordt behandeld, zelfs niet met het externe sleutelwoord. Het global.h-bestand ziet er ongeveer zo uit

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

lijkt te werken voor elk type aangifte. Gebruik natuurlijk niet het algemene zoekwoord op #define.

Other episodes