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 extern
klíčové slovo
Abychom pochopili, jak externí proměnné souvisejí s extern
klíč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 extern
klíč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 extern
klíč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ě extern
je 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.
extern
Klíčového slova aplikována na prototypu funkce nemá absolutně nic společného (dále jen extern
klíč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í
extern
prohláš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 static
klíč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
.
static
Klíčové slovo ( static
a extern
se 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 static
klíčové slovo při definici lokální proměnné. Bez static
klíč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 static
klíč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“.
static
Klíč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í static
klíč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é
- Programovací jazyk C.
- Prohlášení
- Globální proměnná
- Místní proměnná
- Statická proměnná
- Rozsah
- Funkční prototyp
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).