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

Marc Mongenet marc at mongenet.ch
Wed Apr 16 21:31:16 CEST 2008


Le 15/04/08, Leopoldo Ghielmetti<leopoldo.ghielmetti at a3.epfl.ch> a écrit :
> Si ça ne te fais rien si c'est moi qui te répond. :-)
>

Non, non. ;-)

>  On Tue, 2008-04-15 at 02:37 +0200, Marc Mongenet wrote:
>  >
>  > ----------------------- ex1.c
>  > struct s { int i; } v;
>  > struct s;
>  >
>  > void f(void) {
>  >       struct ps { struct s *p; } ps;
>  >       struct s { int j; } v;
>  >       ps.p = &v;
>  >       ps.p->j = 0;
>  > }
>  >
>  > ----------------------- ex2.c
>  > struct s { int i; } v;
>  >
>  > void f(void) {
>  >       struct s;
>  >       struct ps { struct s *p; } ps;
>  >       struct s { int j; } v;
>  >       ps.p = &v;
>  >       ps.p->j = 0;
>  > }
>  > -----------------------
>
>
> Après compilation l'erreur paraît évident.
>  Dans le premier cas la structure ps utilise la structure s déclarée en
>  dehors de f qui est incompatible avec la variable v et qui ne possède
>  donc pas de membre j, d'où les erreurs:
>  ex1.c: In function 'f':
>  ex1.c:7: warning: assignment from incompatible pointer type
>  ex1.c:8: error: 'struct s' has no member named 'j'
>
>  Dans le second cas on redéclare une structure s locale à la fonction f
>  qui sera donc identique à la structure s utilisée par v, donc tout
>  compile comme un charme.

Dans les deux cas on redéclare une structure s locale à la fonction f. :-)
Pourtant dans un cas la déclaration du pointeur p fait référence à la
structure s déjà déclarée, et pas dans l'autre cas... Troublant, n'est-ce
pas ? ;-)

>  > NB : La seule différence est la position du « struct s; ».
>
> C'est tout la dessus que ça se joue.

Oui. La description précise de ce que fait ce « struct s; » est
d'ailleurs assez tordue.

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



More information about the gull mailing list