Przegląd deklaracji
"Deklaracja" określa interpretację i atrybuty zestawu identyfikatorów. Deklaracja, która powoduje również zarezerwowanie magazynu dla obiektu lub funkcji nazwanej przez identyfikator, jest nazywana "definicją". Deklaracje języka C dla zmiennych, funkcji i typów mają następującą składnię:
Składnia
declaration
:
declaration-specifiers
attribute-seq
opt opt opt init-declarator-list
;
/* attribute-seq
opcja jest specyficzna dla firmy Microsoft */
declaration-specifiers
:
storage-class-specifier
declaration-specifiers
Zdecydować
type-specifier
declaration-specifiers
Zdecydować
type-qualifier
declaration-specifiers
Zdecydować
init-declarator-list
:
init-declarator
init-declarator-list
,
init-declarator
init-declarator
:
declarator
declarator
=
initializer
Uwaga
Ta składnia declaration
nie jest powtarzana w poniższych sekcjach. Składnia w poniższych sekcjach zwykle zaczyna się od declarator
nieterminalnego.
Deklaracje w obiekcie init-declarator-list
zawierają nazwane identyfikatory; init
jest skrótem dla inicjatora. Jest init-declarator-list
to sekwencja deklaratorów rozdzielona przecinkami, z których każda może zawierać dodatkowe informacje o typie lub inicjator albo oba te elementy. Zawiera declarator
identyfikatory, jeśli istnieją, zadeklarowane. Nonterminal declaration-specifiers
składa się z sekwencji specyfikatorów typu i klasy magazynu, które wskazują połączenie, czas trwania magazynu i co najmniej część typu jednostek, które deklaratorzy oznaczają. Deklaracje składają się z niektórych kombinacji specyfikatorów klasy magazynu, specyfikatorów typów, kwalifikatorów typów, deklaratorów i inicjatorów.
Deklaracje mogą zawierać co najmniej jeden atrybut opcjonalny wymieniony w attribute-seq
elemecie ; seq
jest skrótem dla sekwencji. Te atrybuty specyficzne dla firmy Microsoft wykonują kilka funkcji, które zostały szczegółowo omówione w tej książce.
W ogólnej formie deklaracji type-specifier
zmiennej podaje typ danych zmiennej. Może type-specifier
to być związek, tak jak w przypadku modyfikacji typu przez const
lub volatile
. Parametr declarator
nadaje nazwę zmiennej, która może zostać zmodyfikowana w celu zadeklarowania tablicy lub typu wskaźnika. Na przykład:
int const *fp;
deklaruje zmienną o nazwie fp
jako wskaźnik do wartości niemodyfikowalnej (const
). int
W deklaracji można zdefiniować więcej niż jedną zmienną, używając wielu deklaratorów rozdzielonych przecinkami.
Deklaracja musi zawierać co najmniej jeden deklarator lub jego specyfikator typu musi zadeklarować tag struktury, tag unii lub składowe wyliczenia. Deklaratory udostępniają wszelkie pozostałe informacje o identyfikatorze. Deklarator to identyfikator, który można zmodyfikować za pomocą nawiasów ([ ]
), gwiazdki (*
) lub nawiasów ( ( )
), aby zadeklarować odpowiednio tablicę, wskaźnik lub typ funkcji. W przypadku deklarowania prostych zmiennych (takich jak znaki, liczby całkowite i elementy zmiennoprzecinkowe) lub struktur i związków prostych zmiennych declarator
jest tylko identyfikatorem. Aby uzyskać więcej informacji na temat deklaratorów, zobacz Deklaratory i deklaracje zmiennych.
Wszystkie definicje są niejawnie deklaracjami, ale nie wszystkie deklaracje są definicjami. Na przykład deklaracje zmiennych używające specyfikatora extern
klasy magazynu to "odwoływanie się", a nie "definiowanie" deklaracji. Jeśli zmienna zewnętrzna ma być odwoływana przed jego zdefiniowaniem lub jeśli jest zdefiniowana w innym pliku źródłowym z tego, w którym jest używana, extern
wymagana jest deklaracja. Magazyn nie jest przydzielany przez deklaracje "odwoływania się", ani nie można zainicjować zmiennych w deklaracjach.
Klasa magazynu lub typ (lub oba te elementy) jest wymagana w deklaracjach zmiennych. Z wyjątkiem parametru __declspec
tylko jeden specyfikator klasy magazynu jest dozwolony w deklaracji, a nie wszystkie specyfikatory klasy magazynu są dozwolone w każdym kontekście. Klasa magazynu jest dozwolona __declspec
z innymi specyfikatorami klasy magazynu i jest dozwolona więcej niż raz. Specyfikator klasy magazynu deklaracji wpływa na sposób, w jaki zadeklarowany element jest przechowywany i inicjowany, oraz które części programu mogą odwoływać się do elementu.
Terminale storage-class-specifier
zdefiniowane w języku C obejmują auto
, , register
extern
, static
i typedef
. Microsoft C zawiera storage-class-specifier
również terminal __declspec
. Wszystkie storage-class-specifier
terminale z wyjątkiem typedef
i __declspec
są omówione w klasach magazynu. Aby uzyskać informacje na temat typedef
programu , zobacz typedef
Deklaracje. Aby uzyskać informacje na temat __declspec
programu , zobacz Rozszerzone atrybuty klasy magazynu.
Lokalizacja deklaracji w programie źródłowym i obecność lub brak innych deklaracji zmiennej są ważnymi czynnikami w określaniu okresu istnienia zmiennych. Może istnieć wiele ponownych deklaracji, ale tylko jedna definicja. Jednak definicja może pojawić się w więcej niż jednej jednostce tłumaczenia. W przypadku obiektów z wewnętrznym połączeniem ta reguła ma zastosowanie oddzielnie do każdej jednostki tłumaczenia, ponieważ obiekty połączone wewnętrznie są unikatowe dla jednostki tłumaczenia. W przypadku obiektów z połączeniem zewnętrznym ta reguła ma zastosowanie do całego programu. Aby uzyskać więcej informacji na temat widoczności, zobacz Okres istnienia, Zakres, Widoczność i Łączenie.
Specyfikatory typów zawierają pewne informacje o typach danych identyfikatorów. Domyślnym specyfikatorem typu jest int
. Aby uzyskać więcej informacji, zobacz Specyfikatory typów. Specyfikatory typów mogą również definiować tagi typów, strukturę i nazwy składników unii oraz stałe wyliczenia. Aby uzyskać więcej informacji, zobacz Deklaracje wyliczenia, Deklaracje struktury i Deklaracje unii.
Istnieją dwa type-qualifier
terminale: const
i volatile
. Te kwalifikatory określają dodatkowe właściwości typów, które są istotne tylko podczas uzyskiwania dostępu do obiektów tego typu za pośrednictwem wartości l. Aby uzyskać więcej informacji na temat const
i volatile
, zobacz Kwalifikatory typów. Aby uzyskać definicję wartości l, zobacz Wyrażenia L-Value i R-Value.
Zobacz też
Podsumowanie dotyczące składni języka C
Deklaracje i typy
Podsumowanie deklaracji