8806



2. Struktura i elementy programu

2.1. Deklaracje i definicje

Jak już wspomniano, wszystkie wielkoœci występujące w programie muszą być przed ich użyciem zadeklarowane. Deklaracje ustalają nieodzowne odwzoro­wanie pomiędzy strukturami danych i operacjami, a reprezentującymi je konstrukcjami programowymi. Każda deklaracja wiąże podany przez użytkownika identyfikator z odpowiednim typem danych. Większoœć deklaracji, znanych jako deklaracje definiujące lub definicje, powoduje także utworzenie definiowanej wielkoœci, tj. przydzielenie (alokację) jej fizycznej pamięci i ewentualne zainicjowanie. Pozostałe deklaracje, nazywane deklaracjami referencyjnymi lub deklaracjami, mają znaczenie informacyjne, ponieważ jedynym ich zadaniem jest podanie deklarowanej nazwy i jej typu do wiadomoœci kompilatorowi. Tak zadeklarowany identyfikator musi być w programie zdefiniowany - albo póŸniej w tym samym, albo w oddzielnym pliku z kodem Ÿródłowym. Dla danego identyfikatora może wystąpić wiele deklaracji referencyjnych, ale tylko jedna deklaracja definiująca (przypadki takie występują najczęœciej w programach wieloplikowych). Oczywistą jest zasada, że żaden identyfi­kator nie może być użyty w programie przed jego punktem deklaracyjnym w kodzie Ÿródłowym. Deklaracja zakończona œrednikiem nazywa się instrukcją deklaracji.

Najczęœciej deklarowanymi wielkoœciami są zmienne. Zmienną okreœla się jako pewien obszar pamięci o zadanej symbolicznej nazwie, w którym można przechowywać wartoœci, interpretowane zgodnie z zadeklarowanym typem zmiennej. Język C++ uogólnia to pojęcie: wymieniony obszar pamięci może nie posiadać nazwy, może mieć nie jedną lecz kilka nazw, zaœ adres początku obszaru pamięci może być dostępny dla programisty. Przykład 2.1 ilustruje różnorodnoœć możliwych deklaracji i definicji.

Przykład 2.1.

char znak;

char litera = 'A';

char* nazwa = *Cplusplus*;

extern int ii;

int j = 10;

const double pi = 3.1415926;

enum day { Mon, Tue, Wed, Thu, Fri, Sat, Sun };

struct mystruct;

struct complex { float re, im;};

complex zespolone;

typedef complex punkt;

class myclass;

template<class T> abs(T x) { return x < 0 ? -x : x; }

Dyskusja. Jak widać z powyższego przykładu, w deklaracji można umieœcić o wiele więcej informacji dla kompilatora, niż jedynie wskazać, że dana nazwa jest związana z okreœlonym typem. Tylko 3 spoœród nich

extern int ii; struct mystruct; class myclass;

są deklaracjami referencyjnymi, a zatem muszą im towarzyszyć odpowiednie definicje. Definicje struktury mystruct i klasy myclass muszą się znaleŸć w tym samym pliku, w którym podano ich deklaracje, zaœ definicja zmiennej ii musi być podana w jednym z plików programu. Pozostałe deklaracje są jednoczeœnie definicjami: