OVH Cloud OVH Cloud

struct declaration

5 réponses
Avatar
pascal
Bonjour,

Pourquoi cette exemple compile sans erreur :

struct X
{
int valX ;
struct X *x;
struct X *y;
};

alors que :

struct X
{
int valX ;
struct X x;
struct X y;
};

non,ce qui est plutot logique.
Dans le 1er cas comment le compilateur peut d=C3=A9clarer un pointeur de =
type=20
X alors que le bloc de d=C3=A9claration du type X n'est pas encore?

5 réponses

Avatar
kanze
pascal wrote:

Pourquoi cette exemple compile sans erreur :

struct X
{
int valX ;
struct X *x;
struct X *y;
};


Parce que c'est légal. Ceci dit, tout en étant légal en C++,
ce n'est pas très idiomatique ; ça ressemble plutôt du C. Mais
dans les deux cas (C ou C++), après avoir vu « struct X », le
compilateur sait qu'il y a un type qui s'appelle X, et que c'est
une classe (ou une structure, dans le cas de C).

alors que :

struct X
{
int valX ;
struct X x;
struct X y;
};

non,ce qui est plutot logique.


Comme tu dis. Une classe X qui contient une instance de la
classe X (qui lui contient une instance de la classe X, ad
infinitum). Il va falloir pas mal de mémoire.

Dans le 1er cas comment le compilateur peut déclarer un
pointeur de type X alors que le bloc de déclaration du type X
n'est pas encore?


Parce que quand il crée une classe, dans un premier temps, tout
ce qu'il faut au compilateur, c'est la taille de chaque élément,
non les détails sur comment le contruire, ou les noms des
champs. Or, la taille d'un pointeur vers une classe est toujours
la même, quelque soit la classe. Donc, pas de problème d'en
déclarer un pointeur vers une classe dont on ne connaît pas
encore les détails. Tandis que pour une instance d'une classe,
il faut bien en connaître la taille de la classe même, ce qui
veut dire avoir vu tous ses éléments.

En fait, en langage de la norme, on parle des types inachevés --
dès que le compilateur voit « struct X » ou « class X », il sait
que X est une classe, et il le considère comme un type connu
mais inachevés. On peut en faire certaines choses, mais non
d'autres. Surtout, on peut en déclarer (et même définir) des
pointeurs et des références à un type inachevé.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
pascal

pascal wrote:



Pourquoi cette exemple compile sans erreur :






struct X
{
int valX ;
struct X *x;
struct X *y;
};




Parce que c'est légal. Ceci dit, tout en étant légal en C++,
ce n'est pas très idiomatique ; ça ressemble plutôt du C. Mais
dans les deux cas (C ou C++), après avoir vu « struct X », le
compilateur sait qu'il y a un type qui s'appelle X, et que c'est
une classe (ou une structure, dans le cas de C).



alors que :






struct X
{
int valX ;
struct X x;
struct X y;
};






non,ce qui est plutot logique.




Comme tu dis. Une classe X qui contient une instance de la
classe X (qui lui contient une instance de la classe X, ad
infinitum). Il va falloir pas mal de mémoire.



Dans le 1er cas comment le compilateur peut déclarer un
pointeur de type X alors que le bloc de déclaration du type X
n'est pas encore?




Parce que quand il crée une classe, dans un premier temps, tout
ce qu'il faut au compilateur, c'est la taille de chaque élément,
non les détails sur comment le contruire, ou les noms des
champs. Or, la taille d'un pointeur vers une classe est toujours
la même, quelque soit la classe. Donc, pas de problème d'en
déclarer un pointeur vers une classe dont on ne connaît pas
encore les détails. Tandis que pour une instance d'une classe,
il faut bien en connaître la taille de la classe même, ce qui
veut dire avoir vu tous ses éléments.

En fait, en langage de la norme, on parle des types inachevés --
dès que le compilateur voit « struct X » ou « class X », il sa it
que X est une classe, et il le considère comme un type connu
mais inachevés. On peut en faire certaines choses, mais non
d'autres. Surtout, on peut en déclarer (et même définir) des
pointeurs et des références à un type inachevé.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34



Merçi de ton explication.

Il a pas mal de termes employés comme la sémantique,idiomatique que j e
ne comprends pas,aurais tu un lien vers ces définition dans le contexte
du langage informatique bien sur?


Avatar
Loïc Joly

Tout d'abord, je te conseilles de lire
http://www.giromini.org/usenet-fr/repondre.html sur la façon de répondre
dans les news. En particulier, il est recommandé d'ôter du message
auquel on répond le texte qui est devenu innutile, et de répondre juste
sous le point en question.



pascal wrote:



Pourquoi cette exemple compile sans erreur :






struct X
{
int valX ;
struct X *x;
struct X *y;
};




Parce que c'est légal. Ceci dit, tout en étant légal en C++,
ce n'est pas très idiomatique ; ça ressemble plutôt du C.



Pas idiomatique signifie ici qu'un développeur C++ "classique" choisira
de ne pas écrire le code ainsi, même s'il est correct. L'écriture par
défaut en C++ pour ça est :
struct X
{
int valX ;
X *x;
X *y;
};



--
Loïc



Avatar
Samuel Krempp
le Monday 04 April 2005 18:42, écrivit :
Il a pas mal de termes employés comme la sémantique


sémantique => signification, sens.
Pour un langage programmation, ça désigne le comportement, plutot que la
syntaxe.

,idiomatique que je
ne comprends pas,aurais tu un lien vers ces définition dans le contexte
du langage informatique bien sur?


idiomatique est encore un mot de linguiste. Les expressions idiomatique d'un
langage sont des expressions précises communément utilisées. par exemple,
"comme tu voudras" est idiomatique (enfin, j'y connais rien moi.)
en programmation c'est pareil, une technique est idiomatique quand c'est une
façon de faire qque chose qui est très largement utilisée, au point de
valoir expression courante du langage. i.e. : ses lignes de code seront
comprises en un coup d'oeil par la plupart des programmeurs.

--
Sam

Avatar
pascal

le Monday 04 April 2005 18:42, écrivit :


Il a pas mal de termes employés comme la sémantique




sémantique => signification, sens.
Pour un langage programmation, ça désigne le comportement, plutot qu e la
syntaxe.



,idiomatique que je
ne comprends pas,aurais tu un lien vers ces définition dans le contex te
du langage informatique bien sur?




idiomatique est encore un mot de linguiste. Les expressions idiomatique d'un
langage sont des expressions précises communément utilisées. par e xemple,
"comme tu voudras" est idiomatique (enfin, j'y connais rien moi.)
en programmation c'est pareil, une technique est idiomatique quand c'est une
façon de faire qque chose qui est très largement utilisée, au poin t de
valoir expression courante du langage. i.e. : ses lignes de code seront
comprises en un coup d'oeil par la plupart des programmeurs.



Ok,

Merçi de ta réponse.