Přehled deklarací
Deklarace určuje interpretaci a atributy sady identifikátorů. Deklarace, která také způsobí, že úložiště bude vyhrazeno pro objekt nebo funkci pojmenovanou identifikátorem, se nazývá "definice". Deklarace jazyka C pro proměnné, funkce a typy mají tuto syntaxi:
Syntaxe
declaration
:
declaration-specifiers
attribute-seq
opt opt init-declarator-list
;
/* attribute-seq
opt is Microsoft-specific */
declaration-specifiers
:
storage-class-specifier
declaration-specifiers
volit
type-specifier
declaration-specifiers
volit
type-qualifier
declaration-specifiers
volit
init-declarator-list
:
init-declarator
init-declarator-list
,
init-declarator
init-declarator
:
declarator
declarator
=
initializer
Poznámka:
Tato syntaxe declaration
se v následujících částech neopakuje. Syntaxe vnásledujícíchch declarator
Deklarace v názvu init-declarator-list
obsahují identifikátory; init
je zkratka pro inicializátor. Jedná se init-declarator-list
o čárkami oddělenou sekvenci deklarátorů, z nichž každá může mít další informace o typu, nebo inicializátor nebo obojí. Obsahuje declarator
identifikátory, pokud nějaké jsou deklarovány. declaration-specifiers
Nonterminal se skládá z posloupnosti specifikátorů typu a třídy úložiště, které označují propojení, dobu trvání úložiště a aspoň část typu entit, které deklarátory označují. Deklarace se skládají z některé kombinace specifikátorů třídy úložiště, specifikátorů typů, kvalifikátorů typu, deklarátorů a inicializátorů.
Deklarace mohou obsahovat jeden nebo více volitelných atributů uvedených v attribute-seq
; seq
je zkratka pro sekvenci. Tyto atributy specifické pro Microsoft provádějí několik funkcí, které jsou podrobně popsány v této knize.
V obecné podobě deklarace type-specifier
proměnné dává datový typ proměnné. Může type-specifier
být složená, jako když je typ upraven const
nebo volatile
. Dává declarator
název proměnné, pravděpodobně změněn tak, aby deklaruje pole nebo typ ukazatele. Příklad:
int const *fp;
deklaruje proměnnou pojmenovanou fp
jako ukazatel na nemodifikovatelnou (const
) int
hodnotu. V deklaraci můžete definovat více než jednu proměnnou pomocí více deklarátorů oddělených čárkami.
Deklarace musí mít alespoň jeden deklarátor nebo jeho specifikátor typu musí deklarovat značku struktury, sjednocovací značku nebo členy výčtu. Deklarátory poskytují všechny zbývající informace o identifikátoru. Deklarátor je identifikátor, který lze upravit pomocí závorek ([ ]
), hvězdičk (*
) nebo závorek ( ( )
) pro deklaraci pole, ukazatele nebo typu funkce. Když deklarujete jednoduché proměnné (například znak, celé číslo a položky s plovoucí desetinou čárkou) nebo struktury a sjednocení jednoduchých proměnných, declarator
je to jen identifikátor. Další informace o deklarátorech naleznete v tématu Deklarátory a deklarace proměnných.
Všechny definice jsou implicitně deklarace, ale ne všechny deklarace jsou definice. Například deklarace proměnných používající extern
specifikátor třídy úložiště jsou "odkazující", nikoli "definování" deklarací. Pokud se má externí proměnná odkazovat před jeho definováním nebo pokud je definovaná v jiném zdrojovém souboru z jiného zdrojového souboru, ve kterém se používá, extern
je potřeba deklarace. Úložiště není přiděleno "odkazováním" deklarací, ani není možné inicializovat proměnné v deklaracích.
Třída úložiště nebo typ (nebo obojí) se vyžaduje v deklarací proměnných. __declspec
S výjimkou , pouze jeden specifikátor třídy úložiště je povolen v deklaraci a ne všechny specifikátory třídy úložiště jsou povoleny v každém kontextu. Třída __declspec
úložiště je povolena s jinými specifikátory třídy úložiště a je povolena více než jednou. Specifikátor třídy úložiště deklarace ovlivňuje způsob uložení a inicializace deklarované položky a toho, které části programu mohou odkazovat na položku.
Terminály storage-class-specifier
definované v jazyce C zahrnují auto
, extern
, register
, static
, a typedef
. Microsoft C zahrnuje storage-class-specifier
také terminál __declspec
. Všechny storage-class-specifier
terminály s výjimkou typedef
a __declspec
jsou popsány v třídách úložiště. Informace o typedef
deklaracích naleznete v tématu typedef
Deklarace. Další informace naleznete v __declspec
tématu Rozšířené atributy třídy úložiště.
Umístění deklarace ve zdrojovém programu a přítomnost nebo absence jiných deklarací proměnné jsou důležitými faktory při určování doby života proměnných. Může existovat více redeklarací, ale pouze jedna definice. Definice se ale může zobrazit ve více než jedné jednotce překladu. Pro objekty s interním propojením platí toto pravidlo zvlášť pro každou jednotku překladu, protože interně propojené objekty jsou jedinečné pro jednotku překladu. Pro objekty s externím propojením platí toto pravidlo pro celý program. Další informace o viditelnosti najdete v tématu Životnost, Rozsah, Viditelnost a Propojení.
Specifikátory typu poskytují určité informace o datových typech identifikátorů. Výchozí specifikátor typu je int
. Další informace naleznete v tématu Specifikátory typů. Specifikátory typů mohou také definovat značky typů, názvy součástí struktury a sjednocení a konstanty výčtu. Další informace naleznete v tématu Výčtové deklarace, Deklarace struktury a Deklarace sjednocení.
Existují dva type-qualifier
terminály: const
a volatile
. Tyto kvalifikátory určují další vlastnosti typů, které jsou relevantní pouze při přístupu k objektům tohoto typu prostřednictvím l-hodnot. Další informace o const
kvalifikátorech typu a volatile
naleznete v tématu kvalifikátory typu. Definice l-hodnot naleznete v tématu L-Value a R-Value Expressions.