Déclaration de variable statique (C)

Les deux déclarations de variable static suivantes sont-elles équivalentes?

1.

  static int var1; static int var2; static int var3; 

2

  static int var1, var2, var3; 

Plus précisément, dans le cas 2, toutes les variables seront-elles static ou simplement var1 ?

Oui, les déclarations des cas 1 et 2 sont identiques. Nous pouvons le voir en consultant le projet de norme C99, section 6.7.5 Déclarateurs, qui dit (à l’ avantage de moi ):

Chaque déclarant déclare un identificateur et affirme que lorsqu’un opérande de même forme que le déclarant apparaît dans une expression, il désigne une fonction ou un object avec la scope, la durée de stockage et le type indiqués par les spécificateurs de déclaration .

Nous pouvons voir la grammaire de la section 6.7 Déclarations est la suivante:

 declaration: declaration-specifiers init-declarator-listopt ; 

les spécificateurs de déclaration incluent la durée de stockage:

 declaration-specifiers: storage-class-specifier declaration-specifiersopt 

le spécificateur de durée de stockage s’applique donc à tous les déclarateurs de la liste init-declarator-list qui présente la grammaire suivante:

 init-declarator-list: init-declarator init-declarator-list , init-declarator init-declarator: declarator declarator = initializer 

Vous vous interrogez peut-être sur les pointeurs, ils sont gérés différemment et nous pouvons le voir d’après la grammaire de 6.7.5 pour les déclarateurs :

 declarator: pointeropt direct-declarator [...] pointer: * type-qualifier-listopt * type-qualifier-listopt pointer 

Ils sont équivalents.

Dans le cas 2, toutes les variables seront statiques.

Le spécificateur de classe de stockage static s’applique à toutes les variables déclarées dans la déclaration.

Vous venez de montrer comment les variables peuvent être déclarées différemment.

  static int var1, var2, var3; 

ou

 static int var1; static int var2; static int var3; 

a la même signification

c’est à dire; une variable du même type de données (et de la même classe de stockage) peut être déclarée individuellement ou une seule fois

 static int var1, var2, var3; 

est équivalent à:

 static int var1; static int var2; static int var3; 

le cas 1 ou le cas 2 sont tous deux utilisés à des fins de lisibilité, mais leur signification est la même.