Specifikátory paměťových tříd pro externí úrovni prohlášení
Externí proměnné jsou v rozsahu souboru proměnných.Jsou definovány mimo jakékoli funkce a potenciálně k dispozici mnoho funkcí.Funkce lze definovat pouze na vnější úrovni a proto nelze vnořovat.Standardně jsou všechny odkazy na externí proměnné a funkce se stejným názvem odkazy na stejný objekt, což znamená, že mají "externí navázání." (Můžete použít statické klíčové slovo potlačeno.Dále v části Podrobné informace najdete na statické.)
Deklarace proměnných na vnější úrovni jsou buď definice proměnných ("definování prohlášení") nebo odkazy na proměnné definované jinde ("odkazující prohlášení").
Externí deklarace proměnné, která také inicializuje proměnnou (implicitně nebo explicitně) je definice deklarace proměnné.Definice na vnější úrovni může trvat několik formulářů:
Proměnná, kterou deklarujete pomocí statické specifikátoru třídy úložiště.Můžete inicializovat explicitně statické proměnné s konstantní výraz, jak je popsáno v Inicializace.Vynecháte-li inicializátoru proměnné je inicializován 0 ve výchozím nastavení.Tyto dva příkazy jsou například obě zvažované definice proměnné k.
static int k = 16; static int k;
Proměnná, která explicitně inicializovat externí úrovni.Například int j = 3; je definice proměnné j.
V deklarace proměnných na úrovni externí (, mimo všech funkcí), můžete použít statické nebo extern specifikátoru třídy úložiště nebo zcela vynechat specifikátoru třídy úložiště.Nelze použít automaticky a zaregistrovatspecifikátoru třídy úložiště terminálů na vnější úrovni.
Jakmile je proměnná definována na úrovni externí, je zobrazen ve zbytku jednotky překlad.Proměnná není viditelné před jeho prohlášení stejného zdrojového souboru.Také se nezobrazuje v další zdrojové soubory programu, pokud referenčního prohlášení zobrazí ho, jak je popsáno níže.
Pravidla týkající se statické zahrnují:
Proměnné deklarované mimo všechny bloky bez statické klíčové slovo vždy zachovat jejich hodnoty v celém programu.Omezit jejich přístup k překladu konkrétní jednotku, je nutné použít statické klíčové slovo.Díky jejich "vnitřní propojení." Chcete-li je globální pro celý program, vynecháte třída explicitní úložiště nebo použít klíčové slovo extern (viz pravidla v dalším seznamu).Díky jejich "externí navázání." Interní a externí propojení jsou popsány také v navázání.
Můžete definovat proměnné na úrovni externí pouze jednou v rámci programu.Můžete definovat jiné proměnné se stejným názvem a statické specifikátoru třídy úložiště v různých překlad jednotce.Od každého statické definice je viditelná pouze v rámci své vlastní jednotky překladu dochází ke konfliktu.To poskytuje vhodný způsob, jak skrýt názvy identifikátorů, které musí být sdílený mezi funkce překladu jedné jednotky, ale nejsou viditelné na jiné jednotky překlad.
Statické specifikátoru třídy úložiště můžete použít také funkce.Je-li deklarovat funkci statické, jeho název je neviditelný mimo ze souboru, který je deklarován.
Pravidla pro používání extern jsou:
extern Specifikátoru třídy úložiště prohlašuje odkaz na proměnnou definované jinde.Můžete použít extern prohlášení zviditelnit definici v jiném zdrojovém souboru nebo vytvořit proměnnou, viditelné před jeho definice stejný zdrojový soubor.Jakmile deklarujete proměnné na úrovni externí odkaz, je zobrazen ve zbytku překlad jednotky dojde k deklarované referenční proměnná.
Pro extern odkaz na platné, odkazuje proměnná musí být definován jednou a pouze jednou na vnější úrovni.Tato definice (bez extern třídy úložiště) může být v libovolném překlad jednotek, které tvoří program.
Příklad
Následující příklad ilustruje externí prohlášení:
/******************************************************************
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
}
Dva zdrojové soubory v tomto příkladu obsahují celkem tři externí prohlášení o i.Pouze jedna deklarace je "definiční prohlášení". Prohlášení,
int i = 3;
definuje globální proměnnou i a inicializuje s počáteční hodnotu 3."Odkazující" prohlášení o i v horní části pomocí souboru první zdroj extern k před jeho definice prohlášení zviditelní globální proměnné v souboru.Odkazující prohlášení o i v druhé zdrojový soubor také zviditelní proměnné v souboru zdroje.Pokud jednotka překlad neposkytuje definuje instanci proměnné, kompilátor předpokládá je
extern int x;
odkazování na prohlášení a definování odkaz
int x = 0;
Zobrazí se v jiné jednotce překlad programu.
Všechny tři funkce main, next, a other, provést stejný úkol: zvýšit jejich i a vytisknout ji.Hodnoty 4, 5 a 6 jsou vytištěny.
Pokud proměnná i nebyla inicializována, je by byly nastaveny na hodnotu 0 automaticky.V tomto případě hodnoty 1, 2 a 3 by byly vytištěny.Viz Inicializace informace o inicializace proměnných.