Partager via


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-specifiersattribute-seqoptinit-declarator-listopt;

/* attribute-seqopt est spécifique à Microsoft */

declaration-specifiers:
storage-class-specifierdeclaration-specifiersopt
type-specifierdeclaration-specifiersopt
type-qualifierdeclaration-specifiersopt

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