Externí proměnná - External variable

V programovacím jazyce C je externí proměnná proměnná definovaná mimo jakýkoli funkční blok. Na druhou stranu je lokální (automatická) proměnná proměnná definovaná uvnitř funkčního bloku.

Jako alternativu k automatickým proměnným je možné definovat proměnné, které jsou vnější ke všem funkcím, tj. Proměnné, ke kterým lze libovolně přistupovat pomocí libovolné funkce. (Tento mechanismus je spíše jako proměnné Fortran COMMON nebo Pascal deklarované v nejvzdálenějším bloku.) Protože externí proměnné jsou globálně přístupné, lze je použít ke komunikaci dat mezi funkcemi místo seznamů argumentů. Kromě toho, protože externí proměnné zůstávají v existenci trvale, místo aby se objevovaly a mizely při vyvolání a ukončení funkcí, zachovávají si své hodnoty i po návratu funkcí, které je nastavují.

Definice, prohlášení a externklíčové slovo

Abychom pochopili, jak externí proměnné souvisejí s externklíčovým slovem, je nutné znát rozdíl mezi definováním a deklarováním proměnné. Když je definována proměnná , kompilátor přiděluje paměť této proměnné a případně také inicializuje její obsah na nějakou hodnotu. Když je deklarována proměnná , kompilátor vyžaduje, aby byla proměnná definována jinde. Deklarace informuje kompilátor, že existuje proměnná podle tohoto názvu a typu, ale kompilátor pro ni nemusí přidělit paměť, protože je přidělena jinde. Mezi externklíčové slovo znamená „prohlašují, bez definování“. Jinými slovy, je to způsob, jak explicitně deklarovat proměnnou nebo vynutit deklaraci bez definice. Je také možné explicitně definovat proměnnou, tj. Vynutit si definici. To se provádí přiřazením inicializační hodnoty proměnné. Pokud externklíčové slovo ani hodnota inicializace nejsou k dispozici, příkaz může být buď deklarace, nebo definice. Je na kompilátoru, aby analyzoval moduly programu a rozhodl se.

Proměnná musí být definována přesně jednou v jednom z modulů programu. Pokud neexistuje žádná definice nebo více než jedna, dojde k chybě, pravděpodobně ve fázi propojení. Proměnná může být deklarována mnohokrát, pokud jsou deklarace konzistentní navzájem as definicí (něco, co soubory záhlaví značně usnadňují). Může být deklarován v mnoha modulech, včetně modulu, kde byl definován, a dokonce i mnohokrát ve stejném modulu. Ale obvykle je zbytečné deklarovat to v modulu více než jednou.

Externí proměnná může být také deklarována uvnitř funkce. V tomto případě externje nutné použít klíčové slovo, jinak jej kompilátor bude považovat za definici místní ( automatické ) proměnné, která má jiný rozsah, životnost a počáteční hodnotu. Tato deklarace bude viditelná pouze uvnitř funkce namísto v celém modulu funkce.

externKlíčového slova aplikována na prototypu funkce nemá absolutně nic společného (dále jen externklíčové slovo aplikována na definici funkce je, samozřejmě, non-sensical). Funkční prototyp je vždy deklarace a nikdy definice. Ve standardu C je funkce vždy externí, ale některá rozšíření kompilátoru umožňují definovat funkci uvnitř funkce.

Externí proměnná musí být definována, přesně jednou, mimo jakoukoli funkci; tím se pro něj vyčlení úložiště. Proměnná musí být také deklarována v každé funkci, která k ní chce získat přístup; toto udává typ proměnné. Deklarace může být explicitní externprohlášení nebo může být implicitní z kontextu. ... Měli byste si uvědomit, že používáme definici a deklaraci slova opatrně, když odkazujeme na externí proměnné v této části. Definice odkazuje na místo, kde je proměnná vytvořena nebo je jí přiřazeno úložiště; deklarace odkazuje na místa, kde je uvedena povaha proměnné, ale není přiděleno žádné úložiště.

Rozsah, životnost a staticklíčové slovo

K externí proměnné mohou přistupovat všechny funkce ve všech modulech programu. Je to globální proměnná . Aby funkce mohla proměnnou používat, musí před definicí funkce ve zdrojovém kódu ležet deklarace nebo definice externí proměnné. Nebo uvnitř funkce musí být deklarace proměnné s klíčovým slovem extern.

staticKlíčové slovo ( statica externse vzájemně vylučují), aplikuje na definici externí proměnné, mění tento kousek: proměnná může být přístupné pouze funkce ve stejném modulu, kde to bylo definováno. Je však možné, aby funkce ve stejném modulu předala odkaz (ukazatel) proměnné na jinou funkci v jiném modulu. V tomto případě, i když je funkce v jiném modulu, může číst a upravovat obsah proměnné - prostě na ni nemůže odkazovat jménem.

Je také možné použít staticklíčové slovo při definici lokální proměnné. Bez staticklíčového slova je proměnná automaticky přidělena při volání funkce a uvolněna při ukončení funkce (tedy název „automatická proměnná“). Jeho hodnota není zachována mezi voláními funkcí. U staticklíčového slova je proměnná přidělena při spuštění programu a uvolněna po ukončení programu. Jeho hodnota není mezi voláními funkcí ztracena. Proměnná je stále lokální, protože k ní lze přistupovat pouze podle názvu uvnitř funkce, která ji definovala. Ale odkaz (ukazatel) na to může být předán jiné funkci, což jí umožňuje číst a upravovat obsah proměnné (opět bez odkazu na ni jménem).

Externí proměnné se přidělují a inicializují při spuštění programu a paměť se uvolní až po ukončení programu. Jejich životnost je stejná jako v programu.

Pokud se inicializace neprovádí explicitně, externí (statické nebo ne) a lokální statické proměnné se inicializují na nulu. Místní automatické proměnné jsou neinicializované, tj. Obsahují hodnoty „koše“.

staticKlíčového slova aplikována na definici funkce změní vazby funkce tak, že je viditelný pouze z překladatelského oddělení, kde se nachází jeho definice. Tím se zabrání tomu, aby byla funkce volána jménem zvenčí jejího modulu (zůstává možné předat ukazatel funkce z modulu a použít jej k vyvolání funkce). Deklarace funkce pomocí staticklíčového slova je také dobrý způsob, jak udržet její název krátký a zároveň zabránit střetu s názvy.

Příklad (programovací jazyk C)

Soubor 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;
  }

Soubor 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;
  }

V tomto příkladu je proměnná Global_Variable definována v souboru 1. Aby bylo možné použít stejnou proměnnou v souboru 2, musí být deklarována . Bez ohledu na počet souborů je globální proměnná definována pouze jednou; musí však být deklarován v každém souboru mimo soubor obsahující definici.

Pokud je program v několika zdrojových souborech a proměnná je definována v souboru1 a používá se v souborech2 a souborech3, jsou pro připojení výskytů proměnné v souborech2 a souborech3 zapotřebí externí deklarace. Obvyklou praxí je shromažďovat externí deklarace proměnných a funkcí v samostatném souboru, který se historicky nazývá záhlaví a který je zahrnut znakem #include v přední části každého zdrojového souboru. Přípona .h je konvenční pro názvy záhlaví.

Normální metodika spočívá v tom, že alokace a skutečné definice přejdou do souborů .c, ale pouhá prohlášení a prototypy nepřidělují a pouze popisují typy a parametry, aby kompilátor mohl správně fungovat a tyto informace patří do souboru záhlaví .h, který ostatní mohou bezpečně zahrnout bez jakéhokoli možného konfliktu.

Viz také

Reference

externí odkazy

  • Referenční příručka k jazyku Microsoft C: Specifikátory třídy úložiště pro deklarace na externí úrovni
  • „Standard C (C99 s technickou opravou TC1, TC2 a TC3 v ceně)“ (PDF) . (3,61  MiB ) . Zejména viz oddíly 6.2.2 (Propojení identifikátorů), 6.2.4 (Doba uložení objektů), 6.7.1 (Specifikátory třídy úložiště) a 6.9 (Externí definice).