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