Re: [gull] Subtilité de C n° 4 : déclaration de struct

Marc Mongenet marc at mongenet.ch
Wed Apr 23 06:14:23 CEST 2008


Le 23 avril 2008 01:12, JM Nunes <Jose-Manuel.Nunes at sophne.net> a écrit :
>
>  Par contre un pointeur vers une structure peut bien exister sans structure
> aussi bien que toutes opérations avec le pointeur tant que la connaissance
> de la taille occupé en mémoire n'est pas nécessaire.
>  Donc un struct s *ps n'a pas besoin d'être précédé par une struct s ...
>
>  Et là j'ai une question dont la réponse je crains, à la lecture de ce
> topique, n'avoir jamais su. Quel est le scope qui réserve un struct s;, dans
> d'autres termes, dans quel scope peut être complétée cette déclaration de
> type?
>  Je pense à
>
>  struct s;
>  ...
>  struct s {...};
>

Complète la déclaration de struct s.

>  et à
>  struct s;
>  ...
>  {struct s {...};}
>

Introduit un nouveau struct s complet dans le scope imbriqué
et laisse l'autre struct s incomplet en le masquant (c'est ce
qui arrive dans mon ex3.c dans un précédent message).

>  Merci d'avance.
>

En conclusion, il apparaît que les règles générales de scoping
(ou de portée si l'on préfère) et de masquage (shadowing)
s'appliquent.

Voici ce qu'écrit le K&R sur le scoping (§A11.1) :
  "If an identifier is explicitely declared at the head of a block,
  including the block constituting a function, any declaration of the
  identifier outside the block is suspended until the end of the block."
On remarque que le K&R écrit bien "outside the block" et pas
"before the declaration" ou autre chose. Donc dans le second cas,
le struct s incomplet est masqué et pas complété. Pour le premier
cas, il faut se référer à §A8.3 :
  "The type becomes complete on occurence of a subsequent
  specifier with that tag, and containing a declaration list."
Mon draft C99 est plus précis à propos du scope :
  "It is completed, for all declarations of that type, by declaring the
  same structure or union tag with its defining content later in the
  same scope."
et :
  "Two declarations of structure, union, or enumerated types
  which are in different scopes or use different tags declare
  distinct types."

Pour être complet, il faut encore signaler ce passage clé du K&R :
  "A very special rule applies to declaration of the form
          struct-or-union identifier ;
  that declare a structure or union, but have no declaration list
  and no declarators. Even if the identifier is a structure or union
  tag already declared in an outer scope (§A11.1), this declaration
  makes the identifier the tag of a new, incompletely-typed
  structure or union in the current scope.
    This recondite rule is new with ANSI. It is intended to deal with
    mutually-recursive structures declared in an inner scope, but
    whose tags might already be declared in the outer scope."

Enfin pour le cas suivant :
 struct s {...};
 struct s;
mon draft du standard C99 écrit :
  "All declarations of structure, union, or enumerated types that
  have the same scope and use the same tag declare the same
  type."
et :
  "A specific type shall have its content defined at most once."
Ce qui permet cette seconde déclaration inutile et incomplète
de struct s dans le même scope (et qui est ignorée par GCC).

-- 
Marc Mongenet
Creator of the Web 2 Markup Language
http://w2ml.com



More information about the gull mailing list