Ekstern variabel - External variable

I programmeringssprog C er en ekstern variabel en variabel, der er defineret uden for enhver funktionsblok. På den anden side er en lokal (automatisk) variabel en variabel defineret inde i en funktionsblok.

Som et alternativ til automatiske variabler er det muligt at definere variabler, der er eksterne for alle funktioner, det vil sige variabler, der kan tilgås ved navn med en hvilken som helst funktion. (Denne mekanisme er snarere som Fortran COMMON- eller Pascal- variabler, der er erklæret i den yderste blok.) Fordi eksterne variabler er tilgængelige globalt, kan de bruges i stedet for argumentlister til at kommunikere data mellem funktioner. Desuden, fordi eksterne variabler forbliver permanent, snarere end at dukke op og forsvinde, når funktioner kaldes og forlades, bevarer de deres værdier, selv efter at de funktioner, der indstiller dem, er vendt tilbage.

Definition, erklæring og externnøgleordet

For at forstå, hvordan eksterne variabler relaterer til externnøgleordet, er det nødvendigt at kende forskellen mellem at definere og erklære en variabel. Når en variabel er defineret , tildeler kompilatoren hukommelse til den variabel og initialiserer muligvis også dens indhold til en værdi. Når en variabel erklæres , kræver kompilatoren, at variablen defineres andetsteds. Erklæringen informerer kompilatoren om, at der findes en variabel med dette navn og type, men compileren behøver ikke at allokere hukommelse til den, da den er allokeret andetsteds. De externsøgeord betyder "erklærer uden at definere". Med andre ord er det en måde at eksplicit erklære en variabel eller at tvinge en erklæring uden en definition. Det er også muligt eksplicit at definere en variabel, dvs. at tvinge en definition. Det gøres ved at tildele en variabel en initialiseringsværdi. Hvis hverken externnøgleordet eller en initialiseringsværdi er til stede, kan udsagnet enten være en erklæring eller en definition. Det er op til compileren at analysere programmets moduler og beslutte.

En variabel skal defineres nøjagtigt en gang i et af programmets moduler. Hvis der ikke er nogen definition eller mere end en, produceres der en fejl, muligvis i sammenkædningstrinnet. En variabel kan erklæres mange gange, så længe erklæringerne er i overensstemmelse med hinanden og med definitionen (noget som headerfiler letter meget). Det kan blive deklareret i mange moduler, inklusive det modul, hvor det blev defineret, og endda mange gange i det samme modul. Men det er normalt meningsløst at erklære det mere end én gang i et modul.

En ekstern variabel kan også erklæres inde i en funktion. I dette tilfælde skal externnøgleordet bruges, ellers betragter compileren det som en definition af en lokal ( automatisk ) variabel, der har et andet omfang, levetid og startværdi. Denne erklæring vil kun være synlig inde i funktionen i stedet for i hele funktionens modul.

Den externnøgleord anvendt på en funktion prototype gør absolut intet (den externsøgeordet anvendes på en funktion definition er naturligvis, ikke-sensical). En funktionsprototype er altid en erklæring og aldrig en definition. I standard C er en funktion altid ekstern, men nogle kompilérudvidelser tillader, at en funktion defineres inde i en funktion.

En ekstern variabel skal defineres nøjagtigt en gang uden for enhver funktion; dette afsætter lagerplads til det. Variablen skal også erklæres i hver funktion, der ønsker adgang til den; dette angiver typen af ​​variablen. Erklæringen kan være en eksplicit externerklæring eller kan være implicit fra sammenhæng. ... Du skal bemærke, at vi bruger orddefinitionen og erklæringen omhyggeligt, når vi henviser til eksterne variabler i dette afsnit. Definition henviser til det sted, hvor variablen oprettes eller tildeles lager; erklæring henviser til steder, hvor variabelens art er angivet, men der ikke er tildelt nogen lagerplads.

Omfang, levetid og staticnøgleordet

En ekstern variabel kan tilgås af alle funktionerne i alle programmets moduler. Det er en global variabel . For at en funktion skal kunne bruge variablen, skal en erklæring eller definitionen af ​​den eksterne variabel ligge før funktionsdefinitionen i kildekoden. Eller der skal være en erklæring om variablen med nøgleordet externinde i funktionen.

Den staticsøgeord ( staticog externudelukker hinanden), anvendes til definitionen af en ekstern variabel, ændrer det en smule: variablen kan kun tilgås af funktionerne i samme modul, hvor det blev defineret. Men det er muligt for en funktion i det samme modul at overføre en reference (markør) til variablen til en anden funktion i et andet modul. I dette tilfælde, selvom funktionen er i et andet modul, kan den læse og ændre indholdet af variablen - den kan bare ikke henvise til den ved navn.

Det er også muligt at bruge staticnøgleordet til definitionen af ​​en lokal variabel. Uden staticnøgleordet tildeles variablen automatisk, når funktionen kaldes og frigives, når funktionen afsluttes (dermed navnet "automatisk variabel"). Dens værdi bevares ikke mellem funktionsopkald. Med staticnøgleordet tildeles variablen, når programmet starter og frigives, når programmet slutter. Dens værdi går ikke tabt mellem funktionsopkald. Variablen er stadig lokal, da den kun kan tilgås ved navn inde i den funktion, der definerede den. Men en henvisning (markør) til den kan overføres til en anden funktion, så den kan læse og ændre indholdet af variablen (igen uden at henvise til den ved navn).

Eksterne variabler tildeles og initialiseres, når programmet starter, og hukommelsen frigives kun, når programmet slutter. Deres levetid er den samme som programmets.

Hvis initialiseringen ikke udføres eksplicit, initialiseres eksterne (statiske eller ej) og lokale statiske variabler til nul. Lokale automatiske variabler er ikke-initialiseret, dvs. indeholder "papirkurven" -værdier.

Den staticnøgleord anvendt på en funktion definition ændrer sammenkædning af funktionen, så det kun er synligt fra oversættelsen enhed, hvor dens definition er placeret. Dette forhindrer, at funktionen kaldes ved navn uden for sit modul (det er fortsat muligt at sende en funktionsmarkør ud af modulet og bruge det til at påkalde funktionen). At erklære en funktion ved hjælp af staticnøgleordet er også en god måde at holde navnet kort, mens man undgår sammenstød med navne.

Eksempel (programmeringssprog C)

Fil 1:

  // Explicit definition, this actually allocates
  // as well as describing
  int Global_Variable;

  // Function prototype (declaration), assumes 
  // defined elsewhere, normally from include file.       
  void SomeFunction(void);        

  int main(void) {
    Global_Variable = 1;
    SomeFunction();
    return 0;
  }

Fil 2:

  // Implicit declaration, this only describes and
  // assumes allocated elsewhere, normally from include
  extern int Global_Variable;  

  // Function header (definition)
  void SomeFunction(void) {       
    ++Global_Variable;
  }

I dette eksempel er variablen Global_Variable defineret i fil 1. For at kunne bruge den samme variabel i fil 2 skal den erklæres . Uanset antallet af filer defineres en global variabel kun én gang; det skal dog erklæres i enhver fil uden for den, der indeholder definitionen.

Hvis programmet findes i flere kildefiler, og en variabel er defineret i file1 og brugt i file2 og file3, er der behov for eksterne erklæringer i file2 og file3 for at forbinde forekomsterne af variablen. Den sædvanlige praksis er at indsamle eksterne erklæringer om variabler og funktioner i en separat fil, historisk kaldet et header, der er inkluderet af #include foran på hver kildefil. Suffikset .h er konventionelt for headernavne.

Den normale metode er, at tildeling og faktiske definitioner skal gå ind i .c-filer, men bare erklæringer og prototyper tildeler ikke og beskriver bare typerne og parametrene, så compileren kan fungere korrekt, og at informationen hører til en .h-headerfil, andre kan med sikkerhed inkludere uden nogen mulig konflikt.

Se også

Referencer

eksterne links

  • Microsoft C-sprogreference: Lagerklasse-specifikationer til erklæringer på eksternt niveau
  • "C-standarden (C99 med teknisk rettelse TC1, TC2 og TC3 inkluderet)" (PDF) . (3,61  MiB ) . Især se afsnit 6.2.2 (Forbindelse af identifikatorer), 6.2.4 (Lagringsvarighed af objekter), 6.7.1 (Lagerklasse-specifikationer) og 6.9 (Eksterne definitioner).