Sdílet prostřednictvím


Specifikátory třídy úložiště pro deklarace na externí úrovni

Externí proměnné jsou proměnné v rozsahu souboru.Jsou definovány mimo jakoukoliv funkci a jsou potenciálně dostupné pro mnoho funkcí.Funkce lze definovat pouze na vnější úrovni a proto nemohou být vnořeny.Ve výchozím nastavení jsou všechny odkazy na externí proměnné a funkce se stejným názvem odkazy na stejný objekt, což znamená, že mají "externí propojení." (Pro přepsání lze použít klíčové slovo static.Dále v této části lze získat podrobné informace o klíčovém slově static.)

Deklarace proměnných na vnější úrovni jsou buď definice proměnných ("definování deklarací") nebo odkazy na proměnné definované jinde ("odkazující deklarace").

Externí deklarace proměnné, která také inicializuje proměnnou (implicitně nebo explicitně) je deklarace definice proměnné.Definici na vnější úrovni lze provést několika způsoby:

  • Proměnná deklarovaná pomocí statického identifikátoru paměťových tříd.Je možné explicitně inicializovat statickou proměnnou pomocí konstantního výrazu, jak je popsáno v tématu Inicializace.Při vynechání inicializátoru je ve výchozím nastavení proměnná inicializována na hodnotu 0.Tyto dva příkazy jsou například oba zvažované definice proměnné k.

    static int k = 16;
    static int k;
    
  • Proměnná, která je explicitně inicializována na vnější úrovni.Například int j = 3; je definice proměnné j.

V deklaraci proměnných na vnější úrovni (což je mimo všechny funkce), lze použít specifikátory paměťových tříd static nebo extern nebo lze specifikátory paměťových tříd zcela vynechat.Na vnější úrovni nelze použít terminály specifikátory paměťových tříd auto a register.

Jakmile je proměnná definována na vnější úrovni, je viditelná ve zbytku jednotky překladu.Proměnná není viditelná před její deklarací ve stejném zdrojovém souboru.Také se nezobrazuje v jiných zdrojových souborech programu, pokud není umožněno její zobrazení pomocí odkazující deklarace, jak je popsáno níže.

Pravidla týkající se klíčového slova static zahrnují:

  • Proměnné deklarované mimo všechny bloky bez zachování hodnot programu pomocí klíčového slova static.Pro omezení jejich přístupu k určitým jednotkám překladu je nutné použít klíčové slovo static.To jim umožňuje "vnitřní propojení." Aby mohly být globálními v rámci celého programu, je třeba vynechat třídu explicitního uložiště a použít klíčové slovo extern (viz pravidla v dalším seznamu).To jim umožňuje "vnější propojení." Vnitřní a vnější propojení jsou popsána také v tématu Propojení.

  • V rámci programu lze definovat proměnné na vnější úrovni pouze jednou.V jiné jednotce překladu je možné definovat další proměnnou se stejným názvem a specifikátor paměťových tříd static .Jelikož je každá definice static viditelná pouze v rámci své vlastní jednotky překladu, nedochází ke konfliktům.To poskytuje vhodný způsob, jak skrýt názvy identifikátorů, které musí být sdílený mezi funkcemi překladu jedné jednotky, ale nesmí být viditelné pro ostatní jednotky překladu.

  • Na funkce lze specifikátory paměťových tříd static použít také.Po deklarování funkce jako static, bude její název neviditelný vně souboru, ve kterém je deklarována.

Pravidla pro používání extern jsou:

  • Specifikátor paměťové třídy extern deklaruje odkaz na proměnnou definovanou jinde.Pro vytvoření definice v jiném zdrojovém souboru nebo pro upřednostnění zviditelnění proměnné před její definicí ve stejném zdrojovém souboru lze použít deklaraci extern.Jakmile je deklarován odkaz na proměnnou na vnější úrovni, je proměnná viditelná napříč zbytkem jednotky překladu, ve které se nachází deklarovaný odkaz.

  • Aby byl odkaz extern platný, proměnná, na kterou odkazuje musí být na vnější úrovni definována nanejvýš jednou.Tato definice (bez třídy úložiště extern) může být v libovolných jednotkách překladu, které tvoří program.

Příklad

Následující příklad ukazuje externí deklarace:

/******************************************************************
                      SOURCE FILE ONE 
*******************************************************************/
#include <stdio.h>

extern int i;                // Reference to i, defined below 
void next( void );           // Function prototype            

int main()
{
    i++;
    printf_s( "%d\n", i );   // i equals 4 
    next();
}

int i = 3;                  // Definition of i

void next( void )
{
    i++;
    printf_s( "%d\n", i );  // i equals 5
    other();
}

/******************************************************************
                      SOURCE FILE TWO 
*******************************************************************/
#include <stdio.h>

extern int i;              // Reference to i in 
                           // first source file 
void other( void )
{
    i++;
    printf_s( "%d\n", i ); // i equals 6 
}

V tomto příkladu obsahují dva zdrojové soubory celkem tři externí deklarace i.Pouze jedna deklarace je "definování deklarace." Tato deklarace,

int i = 3;

definuje globální proměnnou i a inicializuje ji s počáteční hodnotou 3."Odkazující" deklarace i v horní části prvního souboru prostředků pomocí extern dává přednost zviditelnění globální proměnné před definováním její deklarace v souboru.Odkazující deklarace i také způsobí ve druhém souboru prostředků zviditelnění proměnné v daném souboru prostředků.Není-li poskytnuta instance definování proměnné v jednotce překladu, kompilátor předpokládá přítomnost

extern int x;

odkazující deklarace a to, že se definující odkaz

int x = 0;

zobrazí v jiné jednotce překladu programu.

Všechny tři funkce, main, next a other provádějí stejný úkol: Zvyšují i a zobrazí ji na výstupu.Jsou zobrazeny hodnoty 4, 5 a 6.

Nebyla-li proměnná i inicializována, měla by být automaticky nastavena na hodnotu 0.V tomto případě by byly vypsány hodnoty 1, 2 a 3.Více informací o inicializaci proměnné naleznete v tématu Inicializace.

Viz také

Referenční dokumentace

Třídy úložiště jazyka C