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 permet également que le stockage soit réservé pour l'objet ou la fonction nommés par l'identificateur est appelée une « définition ». Les déclarations C pour les variables, fonctions et types présentent la syntaxe suivante :
Syntaxe
declaration:
declaration-specifiers attribute-seqopt init-declarator-listopt**;**/* attribute-seqopt est spécifique de Microsoft */
declaration-specifiers:
storage-class-specifier declaration-specifiers opttype-specifier declaration-specifiers opt
type-qualifier declaration-specifiers opt
init-declarator-list :
init-declaratorinit-declarator-list , init-declarator
init-declarator :
declaratordeclarator = 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 présentes dans init-declarator-list contiennent les identificateurs avec nom. init est l'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. Par conséquent, 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 une variété de 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é, par exemple 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 de pointeur en valeur non modifiable (const) int. 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 un tableau, un pointeur ou un type de fonction, respectivement. 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 commençant par 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 notamment auto, extern, register, static et typedef. Par ailleurs, Microsoft C inclut le terminal storage-class-specifier __declspec. Tous les terminaux storage-class-specifier, sauf typedef et __declspec, sont abordés dans Classes de stockage. Voir Déclarations Typedef pour plus d'informations sur typedef. Voir Attributs étendus de classe de stockage pour plus d'informations sur __declspec.
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. Voir Durée de vie, portée, visibilité et liaison pour plus d'informations sur la visibilité.
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 balises de type, des noms de composant de structure et d'union, et des constantes d'énumération. Pour plus d'informations, voir 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, voir Qualificateurs de type. Pour obtenir une définition des I-values, voir Expressions L-Value et R-Value.
Voir aussi
Référence
Résumé de la syntaxe du langage C