Hledejte v chronologicky řazené databázi studijních materiálů (starší / novější příspěvky).

5. Oblast platnosti identifikátoru, proměnné lokální, globální, funkce a její prototyp.

5. Oblast platnosti identifikátoru, proměnné lokální, globální, funkce a její prototyp.

Identifikátor = např. jméno proměnné nebo funkce.

Lokální proměnné:
Lokální definice definují proměnné, jejichž rozsah platnosti je od místa definice do konce funkce, ve které jsou definovány. Tyto definice se vyskytují uvnitř definicí funkcí.
Pozn.: Daly by se ještě přidat modifikátory paměťové třídy(auto, static, register, const), ale to se týká jiné otázky.

Globální proměnné:
Globální proměnné definují proměnné, jejichž rozsah platnsti je od místa definice do konce souboru. Tyto definice se vyskytují vně definic(mimo definice) funkcí. Exituje-li globální proměnná se stejným identifikátorem, jako lokální proměnná nějaké funkce je touto lokální proměnnou zastíněna.

Sdílení proměnných
Mezi moduly lze sdílet pouze globální datové objekty, neboť ty existují po celou dobu vykonávání programu. Nepřímo pak, voláním sdílené funkce, lze sdílet i statické lokální proměnné. Lokální automatické proměnné sdílet nelze, již kvůli omezené délce jejich trvání (po dobu vykonávání funkce v níž jsou definovány).

Sdílená proměnná musí být definována právě v jednom modulu. V ostatních modulech, ve kterých chceme k této proměnné přistupovat musí být tato proměnná již pouze deklarována (tedy již nedochází k dalšímu přidělení paměti, pouze je překladači oznámena její existence v jiném modulu).

Deklarace sdílené proměnné vypadá stejně jako její definice, jen s tím rozdílem, že před ní ještě uvedeme klíčové slovo extern. V deklaraci proměnné nikdy nesmíme použít její inicializaci. Překladač by pak deklaraci považoval za definici nehledě na klíčové slovo extern.
Následující příklad snad celou záležitost trochu objasní. Mějme dva soubory a.cpp a b.cpp, které budeme překládat odděleně, a ve kterých budeme chtít sdílet proměnné x, y a z.
//v souboru a.cpp:
int x;
int y;
extern int z;

//v souboru b.cpp:
extern int x;
int y;
extern int z;
Pouze proměnná x je sdílena správně. Proměnná y je definována v obou překládaných souborech a při spojení obou modulů linkerem by tedy došlo ke kolizi. Naopak proměnná z je v obou souborech pouze deklarována, ve skutečnosti tedy fyzicky neexistuje a nedá se tedy použít.

Nesdílené proměnné
Pokud chceme, aby globální proměnná byla viditelná pouze v rámci svého modulu, uvedeme před její definici klíčové slovo static (Pozor, static se používá i pro automatické lokální proměnné, ale v obou případech je význam jeho použití jiný.). Protože je taková proměnná viditelná pouze v modulu, kde je definována, v ostatních modulech mohou existovat jiné proměnné se stejným identifikátorem.

Úpravou předchozího příkladu získáme dvě proměnné s identifikátorem y, které jsou ovšem ,narozdíl od proměnné x, nezávislé (změna hodnoty y v jednom modulu neovlivní hodnotu y ve druhém) a navzájem si nepřekážejí.
//v souboru a.c:
int x;
static int y;

//v souboru b.c:
extern int x;
static int y;



Funkce viz otázka č.1

Prototyp funkce(deklarace funkce):
Deklarace funkce je vlastně způsob jak dát překladači všechny potřebné údaje o funkci, aniž bychom ji museli celou definovat(viz Definice funkce výše). Předtím, než funkci zavoláme, měla by být vždy předem definována, nebo deklarována. To proto, aby překladač znal všechny formální parametry, a tak mohl vytvořit správný kód.

Pokud funkci nebudeme ještě před jejím voláním deklarovat ani definovat, bude překladač odhadovat formální parametry podle typu skutečných parametrů (parametry předané funkci při jejím volání), které ale nemusí odpovídat typu parametrů formálních. Výsledkem by pak byl nesprávně sestavený kód. Pokud ale z nějakého důvodu není funkce definována před svým použitím, měla by být alespoň deklarována.

Deklarace funkce vypadá takhle:
návratový_typ identifikátor_funkce (seznam definicí formálních parametrů);
Je to vlastně celá hlavička definice, která je ale zakončená středníkem.
int secti (int a, int b); /*prototyp funkce - deklarace výše definované funkce.*/

Žádné komentáře:

Okomentovat