Extern variabel

I programmeringsspråket C är en extern variabel en variabel som definieras utanför vilket funktionsblock som helst. Å andra sidan är en lokal (automatisk) variabel en variabel som definieras inuti ett funktionsblock.

Som ett alternativ till automatiska variabler är det möjligt att definiera variabler som är externa för alla funktioner, det vill säga variabler som kan nås med namn av vilken funktion som helst. (Denna mekanism är snarare som Fortran COMMON eller Pascal -variabler som deklareras i det yttersta blocket.) Eftersom externa variabler är globalt tillgängliga kan de användas istället för argumentlistor för att kommunicera data mellan funktioner. Dessutom, eftersom externa variabler finns kvar permanent, snarare än att dyka upp och försvinna när funktioner anropas och avslutas, behåller de sina värden även efter att funktionerna som ställer in dem har återvänt.

Definition, deklaration och det externa nyckelordet

För att förstå hur externa variabler relaterar till det externa nyckelordet är det nödvändigt att känna till skillnaden mellan att definiera och deklarera en variabel. När en variabel är definierad allokerar kompilatorn minne för den variabeln och initierar eventuellt även dess innehåll till något värde. När en variabel deklareras kräver kompilatorn att variabeln definieras någon annanstans. Deklarationen informerar kompilatorn om att det finns en variabel med det namnet och typen, men kompilatorn behöver inte allokera minne för den eftersom den är allokerad någon annanstans. Nyckelordet extern betyder "deklarera utan att definiera". Det är med andra ord ett sätt att explicit deklarera en variabel, eller att tvinga fram en deklaration utan definition. Det är också möjligt att explicit definiera en variabel, dvs tvinga fram en definition. Det görs genom att tilldela ett initialiseringsvärde till en variabel. Om varken det externa nyckelordet eller ett initialiseringsvärde finns, kan satsen vara antingen en deklaration eller en definition. Det är upp till kompilatorn att analysera modulerna i programmet och bestämma.

En variabel måste definieras exakt en gång i en av programmets moduler. Om det inte finns någon definition eller mer än en, skapas ett fel, eventuellt i länkningsstadiet. En variabel kan deklareras många gånger, så länge deklarationerna överensstämmer med varandra och med definitionen (något som header-filer underlättar mycket). Det kan deklareras i många moduler, inklusive modulen där det definierades, och till och med många gånger i samma modul. Men det är vanligtvis meningslöst att deklarera det mer än en gång i en modul.

En extern variabel kan också deklareras inuti en funktion. I det här fallet måste det externa nyckelordet användas, annars kommer kompilatorn att betrakta det som en definition av en lokal ( automatisk ) variabel, som har en annan omfattning, livslängd och initialt värde. Denna deklaration kommer endast att vara synlig i funktionen istället för i hela funktionens modul.

Det externa nyckelordet som appliceras på en funktionsprototyp gör absolut ingenting (det externa nyckelordet som appliceras på en funktionsdefinition är naturligtvis meningslöst). En funktionsprototyp är alltid en deklaration och aldrig en definition. I standard C är en funktion alltid extern, men vissa kompilatortillägg tillåter att en funktion definieras inuti en funktion.

En extern variabel måste definieras, exakt en gång, utanför en funktion; detta avsätter förvaring för den. Variabeln måste också deklareras i varje funktion som vill komma åt den; detta anger typen av variabel. Deklarationen kan vara ett uttryckligt externt uttalande eller kan vara implicit från sammanhanget. ... Du bör notera att vi använder orden definition och deklaration noggrant när vi hänvisar till externa variabler i detta avsnitt. Definition avser den plats där variabeln skapas eller tilldelas lagring; deklaration avser platser där variabelns karaktär anges men ingen lagring tilldelas.

Omfattning, livslängd och det statiska nyckelordet

En extern variabel kan nås av alla funktioner i alla moduler i ett program. Det är en global variabel . För att en funktion ska kunna använda variabeln måste en deklaration eller definitionen av den externa variabeln ligga före funktionsdefinitionen i källkoden. Eller så måste det finnas en deklaration av variabeln, med nyckelordet extern , inuti funktionen.

Det statiska nyckelordet ( static och extern är ömsesidigt uteslutande), tillämpat på definitionen av en extern variabel, ändrar detta lite: variabeln kan endast nås av funktionerna i samma modul där den definierades. Men det är möjligt för en funktion i samma modul att skicka en referens (pekare) av variabeln till en annan funktion i en annan modul. I det här fallet, även om funktionen finns i en annan modul, kan den läsa och ändra innehållet i variabeln – den kan bara inte referera till den med namn.

Det är också möjligt att använda det statiska nyckelordet för definitionen av en lokal variabel. Utan det statiska nyckelordet allokeras variabeln automatiskt när funktionen anropas och släpps när funktionen avslutas (därav namnet "automatisk variabel"). Dess värde behålls inte mellan funktionsanrop. Med det statiska nyckelordet allokeras variabeln när programmet startar och släpps när programmet avslutas. Dess värde går inte förlorat mellan funktionsanrop. Variabeln är fortfarande lokal, eftersom den endast kan nås med namn i funktionen som definierade den. Men en referens (pekare) till den kan skickas till en annan funktion, vilket gör att den kan läsa och ändra innehållet i variabeln (igen utan att hänvisa till den med namn).

Externa variabler allokeras och initieras när programmet startar, och minnet frigörs först när programmet avslutas. Deras livstid är densamma som programmets.

Om initieringen inte görs explicit, initieras externa (statiska eller inte) och lokala statiska variabler till noll. Lokala automatiska variabler är oinitierade, dvs innehåller "trash"-värden.

Det statiska nyckelordet som tillämpas på en funktionsdefinition ändrar länkningen av funktionen så att den endast är synlig från översättningsenheten där dess definition finns. Detta förhindrar att funktionen anropas vid namn utanför dess modul (det är fortfarande möjligt att skicka en funktionspekare ut ur modulen och använda den för att anropa funktionen). Att deklarera en funktion med hjälp av det statiska nyckelordet är också ett bra sätt att hålla dess namn kort och samtidigt undvika namnkrockar.

Exempel (C programmeringsspråk)

Fil 1:

  
  
   

  
  
           

    
      
    
     0
   // Explicit definition, detta allokerar faktiskt  // samt beskriver  int  global_variable  ;  // Funktionsprototyp (deklaration), antar  // definierad på annat håll, normalt från include-fil.  void  some_function  (  void  );  int  main  (  void  )  {  global_variable  =  1  ;  some_function  ();  återvända  ;  } 

Fil 2:

  
  
      

  
           
    
   // Implicit deklaration, detta beskriver bara och  // förutsätter allokerad någon annanstans, normalt från include  extern  int  global_variable  ;  // Funktionshuvud (definition)  void  some_function  (  void  )  {  ++  global_variable  ;  } 

I det här exemplet är variabeln Global_Variable definierad i fil 1. För att kunna använda samma variabel i fil 2 måste den deklareras . Oavsett antalet filer definieras en global variabel bara en gång; det måste dock deklareras i vilken fil som helst utanför den som innehåller definitionen.

Om programmet finns i flera källfiler, och en variabel är definierad i fil1 och används i fil2 och fil3, så behövs externa deklarationer i fil2 och fil3 för att koppla ihop förekomsterna av variabeln. Vanlig praxis är att samla externa deklarationer av variabler och funktioner i en separat fil, historiskt kallad en header, som inkluderas av #include längst fram i varje källfil. Suffixet .h är konventionellt för rubriknamn.

Den normala metoden är att allokering och faktiska definitioner går in i .c-filer, men bara deklarationer och prototyper allokerar inte utan beskriver bara typerna och parametrarna så att kompilatorn kan fungera korrekt, och att informationen hör hemma i en .h-huvudfil som andra kan säkert inkludera utan någon möjlig konflikt.

Se även

  • Deklaration – Programmeringsspråkskonstruktion som specificerar en identifierares egenskaper
  • Funktionsprototyp – Deklaration av en funktions namn och typsignatur men inte body
  • Global variabel – Datorprogrammering, en variabel som är tillgänglig i ett datorprogram
  • Linker (beräkning) – Datorprogram som kombinerar flera objektfiler till en enda fil
  • Lokal variabel – Datorprogrammering, en variabel som endast kan användas i en del av ett program (omfattningen)
  • Omfattning – Del av ett datorprogram där en förnamnsbindning är giltig
  • Statisk variabel – Programmeringsvariabel som kvarstår under programmets livstid
  • The C Programming Language – Programmeringsbok skriven av Brian Kernighan och Dennis Ritchie

externa länkar

  • Microsoft C Språkreferens: Storage-Class Specifiers for External Level Declarations
  •   "C-standarden (C99 med tekniska korrigeringar TC1, TC2 och TC3 ingår)" (PDF) . (3,61 MiB ) . Se särskilt avsnitt 6.2.2 (Länkning av identifierare), 6.2.4 (Lagringslängd för objekt), 6.7.1 (Specifierare för lagringsklass) och 6.9 (Externa definitioner).