DODATEK A PRZEWODNIK JĘZYKA C______
inicjowana-lista-deklaratorów:
inicjowany-deklarator
inicjowana-lista-deklaratorów , inicjowany-deklarator
inicjowany-deklarator: deklarator
deklarator = inicjator
Deklaratory zostaną omówione później (p. A8.5); deklarator zawiera deklarowaną nazwę. Deklaracja musi zawierać co najmniej jeden deklarator albo jej specyfikator typu musi deklarować etykietkę struktury, etykietkę unii lub składowe wyliczenia; pusta deklaracja jest zabroniona.
Specyfikatorami klasy pamięci są:
specyfikator-klasy-pamięci:
auto
register
static
extern
typedef
Znaczenie klas pamięci omówiono w p. A4.
Specyfikatory auto i register nadają deklarowanemu obiektowi automatyczną klasę pamięci i mogą być stosowane wyłącznie wewnątrz funkcji. Takie deklaracje są jednocześnie definicjami i powodują zarezerwowanie pamięci. Deklaracja register jest równoważna z deklaracją auto, ale wskazuje, że deklarowany obiekt będzie często używany. W rejestrach maszyny mieści się tylko kilka obiektów i tylko niektóre ich typy są dozwolone - ograniczenia zależą od implementacji. Mimo to do obiektów zadeklarowanych jako register nie wolno stosować jednoargumentowego operatora adresu & - ani jawnie, ani niejawnie.
Zasada zabraniająca obliczania adresu obiektu zadeklarowanego jako register, lecz faktycznie występującego jako auto, jest nowa.
Specyfikator static nadaje deklarowanemu obiektowi statyczną klasę pamięci i może być stosowany zarówno wewnątrz, jak i na zewnątrz funkcji. Wewnątrz funkcji ten specyfikator powoduje zarezerwowanie pamięci, oznacza więc definicję. W punkcie Al 1.2 omówiono znaczenie tego specyfikatora na zewnątrz funkcji.
A8 DEKLARACJE____
Wewnątrz funkcji deklaracje ze specyfikatorem extern wskazują, że klarowanych obiektów będzie zarezerwowana gdzie indziej. W punkcie Al 1.2 omówiono znaczenie tego specyfikatora na zewnątrz funkcji.
Specyfikator typedef nie rezerwuje pamięci. Zalicza się go do specyfikatorów klasy pamięci wyłącznie dla składniowej wygody; będzie omówiony w p. A8.9.
W deklaracji może wystąpić co najwyżej jeden specyfikator klasy pamięci. Jeśli nie podano żadnego, to obowiązują następujące zasady: dla obiektów zadeklarowanych wewnątrz funkcji przyjmuje się klasę auto; dla funkcji zadeklarowanych wewnątrz funkcji przyjmuje się extem; obiekty i funkcje zadeklarowane na zewnątrz funkcji uważa się za statyczne z łącznością zewnętrzną. Patrz p. A10-Al 1.
Specyfikatorami typu są:
specyfikator-typu:
void
char
short
int
long
float
double
signed
unsigned
specyfikator-struktury-un ii specyfikator- wyliczenia nazwa-typedef
Wraz ze specyfikatorem int można użyć jednego ze specyfikatorów long lub short; znaczenie jest takie samo, jakby słowo int było pominięte. Słowo long można podać razem z double. Co najwyżej jeden ze specyfikatorów signed lub unsigned może wystąpić wraz ze słowem int bądź z jego odmianą long lub short, bądź z char. Każdy z nich może wystąpić samodzielnie - wtedy przyjmuje się int. Specyfikator signed przydaje się do wymuszenia znaku arytmetycznego dla obiektów typu char; dla pozostałych typów całkowitych jest zbędny, acz dozwolony.
Oprócz powyższych kombinacji w deklaracji może wystąpić co najwyżej jeden specyfikator typu. Jeśli pominięto specyfikator typu, to przyjmuje się int.
279