Vue d'ensemble des déclarations
Une « déclaration » spécifie l'interprétation et les attributs d'un ensemble d'identificateurs. Une déclaration qui entraîne également une réservation de stockage pour l’objet ou la fonction nommés par l’identificateur est appelée « définition ». Les déclarations C pour les variables, les fonctions et les types ont la syntaxe suivante :
Syntaxe
declaration
:
declaration-specifiers
attribute-seq
opt init-declarator-list
opt ;
/* attribute-seq
opt est spécifique à Microsoft */
declaration-specifiers
:
storage-class-specifier
declaration-specifiers
opt
type-specifier
declaration-specifiers
opt
type-qualifier
declaration-specifiers
opt
init-declarator-list
:
init-declarator
init-declarator-list
,
init-declarator
init-declarator
:
declarator
declarator
=
initializer
Notes
Cette syntaxe pour declaration
n'est pas répétée dans les sections suivantes. La syntaxe des sections suivantes commence généralement par le non terminal declarator
.
Les déclarations figurant dans la init-declarator-list
contiennent les identificateurs nommés. init
est une abréviation d’initialiseur. init-declarator-list
est une séquence de déclarateurs séparés par une virgule. Chacun de ces déclarateurs peut avoir des informations de type supplémentaires ou un initialiseur, ou les deux. declarator
contient les identificateurs déclarés, le cas échéant. Le non terminal declaration-specifiers
consiste en une séquence de spécificateurs de type et de classe de stockage qui indiquent la liaison, la durée de stockage et au moins une partie du type des entités désignées par les déclarateurs. Les déclarations sont constituées d’une combinaison de spécificateurs de classe de stockage, de spécificateurs de type, de qualificateurs de type, de déclarateurs et d’initialiseurs.
Les déclarations peuvent contenir un ou plusieurs attributs facultatifs répertoriés dans attribute-seq
. seq
étant une abréviation de séquence. Ces attributs spécifiques à Microsoft ont plusieurs fonctions que nous aborderons en détail dans ce livre.
Dans la forme générale d’une déclaration de variable, type-specifier
donne le type de données de la variable. type-specifier
peut être un composé, comme quand le type est modifié par const
ou volatile
. declarator
donne le nom de la variable, éventuellement modifié pour déclarer un tableau ou un type de pointeur. Par exemple,
int const *fp;
déclare une variable nommée fp
en tant que pointeur vers une valeur non modifiable int
(const
). Vous pouvez définir plusieurs variables dans une déclaration à l'aide de plusieurs déclarateurs, séparés par une virgule.
Une déclaration doit contenir au moins un déclarateur ou son spécificateur de type doit déclarer une balise de structure, une balise d'union ou des membres d'une énumération. Les déclarateurs fournissent toutes les informations restantes sur un identificateur. Un déclarateur est un identificateur pouvant être modifié à l’aide de crochets ([ ]
), d’astérisques (*
) ou de parenthèses (( )
) pour déclarer respectivement un tableau, un pointeur ou un type de fonction. Quand vous déclarez des variables simples (comme un caractère, un entier et des éléments à virgule flottante) ou des structures et des unions de variables simples, declarator
est juste un identificateur. Pour plus d'informations sur les déclarateurs, voir Déclarateurs et déclarations de variable.
Toutes les définitions sont implicitement des déclarations, mais toutes les déclarations ne sont pas des définitions. Par exemple, les déclarations de variable utilisant le spécificateur de classe de stockage extern
sont des déclarations de « référencement » et non de « définition ». Si une variable externe doit être référencée avant d’être définie, ou si elle est définie dans un autre fichier source que celui dans lequel elle est utilisée, une déclaration extern
est nécessaire. Le stockage n’est pas alloué par les déclarations de « référencement » et les variables ne peuvent pas être initialisées dans les déclarations.
Une classe de stockage ou un type (ou les deux) sont requis dans les déclarations de variable. À l'exception de __declspec
, seul un spécificateur de classe de stockage est autorisé dans une déclaration et tous les spécificateurs de classe de stockage ne sont pas admis dans tous les contextes. La classe de stockage __declspec
est autorisée avec d’autres spécificateurs de classe de stockage et peut être autorisée plusieurs fois. Le spécificateur de classe de stockage d'une déclaration affecte la façon dont l'élément déclaré est stocké et initialisé, ainsi que les parties d'un programme qui peuvent référencer l'élément.
Les terminaux storage-class-specifier
définis en C sont auto
, extern
, register
, static
et typedef
. Microsoft C inclut également le terminal storage-class-specifier
__declspec
. Tous les terminaux storage-class-specifier
, sauf typedef
et __declspec
, sont décrits dans Classes de stockage. Pour plus d’informations sur typedef
, consultez Déclarations typedef
. Pour plus d’informations sur __declspec
, consultez Attributs étendus de classe de stockage.
L'emplacement de la déclaration dans le programme source et la présence ou l'absence d'autres déclarations de la variable sont des facteurs importants pour déterminer la durée de vie des variables. Il peut y avoir plusieurs redéclarations, mais une seule définition. Toutefois, une définition peut apparaître dans plusieurs unités de traduction. Pour les objets avec une liaison interne, cette règle s'applique séparément à chaque unité de traduction, car les objets liés de manière interne sont uniques pour une unité de traduction. Pour les objets avec une liaison externe, cette règle s'applique au programme entier. Pour plus d’informations sur la visibilité, consultez Durée de vie, Étendue, Visibilité et Liaison.
Les spécificateurs de type fournissent des informations sur les types de données des identificateurs. Le spécificateur de type par défaut est int
. Pour plus d'informations, voir Spécificateurs de type. Les spécificateurs de type peuvent aussi définir des étiquettes de type, des noms de composant de structure et d’union, et des constantes d’énumération. Pour plus d’informations, consultez Déclarations d’énumération, Déclarations de structure et Déclarations d’union.
Il existe deux terminaux type-qualifier
: const
et volatile
. Ces qualificateurs spécifient des propriétés supplémentaires de types seulement pour l’accès aux objets de ce type avec des I-values. Pour plus d’informations sur const
et volatile
, consultez Qualificateurs de type. Pour obtenir une définition des I-values, voir Expressions L-Value et R-Value.
Voir aussi
Résumé de syntaxe du langage C
Déclarations et types
Résumé des déclarations