 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Stephane Wirtel Guest
|
Posted: Tue Oct 18, 2005 1:04 pm Post subject: #define : Alias de fonctions ou de champ d'une structure ? |
|
|
bonjour à tous,
Je ne sais pas pourquoi, mais je pense avoir vu un jour un bout de code écrit en C ou C++, qui
donnait la possibilité de créer un alias d'un champ dans une structure.
Je pense que cela se basait sur #define, style:
typedef struct StructFun {
int age;
#define Age age
} StructFun;
Aurais-je rêvé ? Avez-vous déjà vu ayant une similitude avec ma description ?
Merci,
Stephane
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Tue Oct 18, 2005 1:35 pm Post subject: Re: #define : Alias de fonctions ou de champ d'une structure |
|
|
On Tue, 18 Oct 2005 15:04:00 +0200, Stephane Wirtel
<com.descasoft (AT) wirtel (DOT) stephane>:
| Quote: | typedef struct StructFun {
|
Ça, c'est sans aucun doute du C.
| Quote: | int age;
#define Age age
|
Et ça, j'espère que même les programmeurs C ne le font plus.
Tu es en train de dire que partout dans ton programme, l'identifiant
"Age" est un synonyme de "age".
Si dans une autre classe, tu as deux membres "age" et "Age" :
- soit cette autre classe est définie avant, et dans ce cas tu
ne peux plus accéder à son membre "Age" ;
- soit cette autre classe est définie après, et dans ce cas ça
ne compile pas.
Pour répondre à ta question dans le cadre du C++ (pour le C, c'est
fr.comp.lang.c) :
- pour une fonction, c'est fort simple :
struct A
{
public:
void age();
void Age() { age(); }
};
- pour une variable, c'est plus compliqué (Peut-être peut-on faire
quelque chose avec un "union" ?), mais a priori le cas est très rare
de toute façons, puisque généralement, une variable membre est privée.
|
|
| Back to top |
|
 |
Stephane Wirtel Guest
|
Posted: Tue Oct 18, 2005 3:07 pm Post subject: Re: #define : Alias de fonctions ou de champ d'une structure |
|
|
Fabien LE LEZ a écrit :
| Quote: | On Tue, 18 Oct 2005 15:04:00 +0200, Stephane Wirtel
[email]com.descasoft (AT) wirtel (DOT) step[/email]hane>:
typedef struct StructFun {
Ça, c'est sans aucun doute du C.
A quoi vois-tu que cela est du C ?
int age;
#define Age age
Et ça, j'espère que même les programmeurs C ne le font plus.
Tu es en train de dire que partout dans ton programme, l'identifiant
"Age" est un synonyme de "age".
Dans l'exemple donné, il était demandé si il était possible d'implémenter |
des alias sur des champs.
| Quote: |
Si dans une autre classe, tu as deux membres "age" et "Age" :
- soit cette autre classe est définie avant, et dans ce cas tu
ne peux plus accéder à son membre "Age" ;
- soit cette autre classe est définie après, et dans ce cas ça
ne compile pas.
Pour répondre à ta question dans le cadre du C++ (pour le C, c'est
fr.comp.lang.c) :
Je ne vais pas sur fr.comp.lang.c car il s'agit d'un code source écrit en C++, |
et tu sais aussi bien que moi que le compilateur travaille différemment en fct
du langage qu'on lui donne.
| Quote: |
- pour une fonction, c'est fort simple :
Dans le mail, je précisais un champ d'une structure et non une méthode, |
la surcharge aurait été très facile à faire et je ne pense pas que j'aurais
posé la question.
| Quote: |
struct A
{
public:
void age();
void Age() { age(); }
};
Une structure est directement public que cela soit les méthodes ou les champs.
- pour une variable, c'est plus compliqué (Peut-être peut-on faire
quelque chose avec un "union" ?), mais a priori le cas est très rare
de toute façons, puisque généralement, une variable membre est privée.
L'union doit être nommée, et cela veut dire que si je veux accéder à mon champ, |
je dois préfixer chaque accès par le nom de la variable du type de l'union.
Bonne soirée,
Stéphane
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Tue Oct 18, 2005 3:15 pm Post subject: Re: #define : Alias de fonctions ou de champ d'une structure |
|
|
Stephane Wirtel <com.descasoft (AT) wirtel (DOT) stephane> writes:
| Quote: | Fabien LE LEZ a écrit :
On Tue, 18 Oct 2005 15:04:00 +0200, Stephane Wirtel
[email]com.descasoft (AT) wirtel (DOT) step[/email]hane>:
typedef struct StructFun {
Ça, c'est sans aucun doute du C.
A quoi vois-tu que cela est du C ?
|
typedef struct StructFun {} StructFun;
est un idiome typique de C. En C++ les tags sont disponibles
comme type directement et l'idiome n'est possible que parce qu'il y a
des clauses particulieres pour le permettre.
struct StructFun {};
a le meme effet et est plus idiomatique en C++.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
|
|
| Back to top |
|
 |
Stephane Wirtel Guest
|
Posted: Tue Oct 18, 2005 3:22 pm Post subject: Re: #define : Alias de fonctions ou de champ d'une structure |
|
|
| Quote: | Je ne vais pas sur fr.comp.lang.c car il s'agit d'un code source écrit
en C++,
et tu sais aussi bien que moi que le compilateur travaille différemment
en fct
du langage qu'on lui donne.
- pour une fonction, c'est fort simple :
Dans le mail, je précisais un champ d'une structure et non une méthode,
la surcharge aurait été très facile à faire et je ne pense pas que j'aurais
posé la question.
struct A
{
public:
void age();
void Age() { age(); }
};
Une structure est directement public que cela soit les méthodes ou les
champs.
- pour une variable, c'est plus compliqué (Peut-être peut-on faire
quelque chose avec un "union" ?), mais a priori le cas est très rare
de toute façons, puisque généralement, une variable membre est privée.
L'union doit être nommée, et cela veut dire que si je veux accéder à mon
champ,
je dois préfixer chaque accès par le nom de la variable du type de l'union.
Effectivement, en relisant la doc, l'union anonyme permettrait d'accéder aux champs qu'elle recouvre. |
|
|
| Back to top |
|
 |
Stephane Wirtel Guest
|
Posted: Tue Oct 18, 2005 3:23 pm Post subject: Re: #define : Alias de fonctions ou de champ d'une structure |
|
|
Jean-Marc Bourguet a écrit :
| Quote: | Stephane Wirtel <com.descasoft (AT) wirtel (DOT) stephane> writes:
Fabien LE LEZ a écrit :
On Tue, 18 Oct 2005 15:04:00 +0200, Stephane Wirtel
[email]com.descasoft (AT) wirtel (DOT) step[/email]hane>:
typedef struct StructFun {
Ça, c'est sans aucun doute du C.
A quoi vois-tu que cela est du C ?
typedef struct StructFun {} StructFun;
est un idiome typique de C. En C++ les tags sont disponibles
comme type directement et l'idiome n'est possible que parce qu'il y a
des clauses particulieres pour le permettre.
struct StructFun {};
a le meme effet et est plus idiomatique en C++.
A+
Merci Jean-Marc, |
|
|
| Back to top |
|
 |
Franck Branjonneau Guest
|
Posted: Tue Oct 18, 2005 8:27 pm Post subject: Re: #define : Alias de fonctions ou de champ d'une structure |
|
|
Stephane Wirtel <com.descasoft (AT) wirtel (DOT) stephane> écrivait:
| Quote: | - pour une variable, c'est plus compliqué (Peut-être peut-on faire
quelque chose avec un "union" ?), mais a priori le cas est très
rare de toute façons, puisque généralement, une variable membre
est privée.
|
En utilisant une référence ?
| Quote: | L'union doit être nommée, et cela veut dire que si je veux accéder
à mon champ, je dois préfixer chaque accès par le nom de la
variable du type de l'union.
Effectivement, en relisant la doc, l'union anonyme permettrait
d'accéder aux champs qu'elle recouvre.
|
Mais n'est-ce pas du comportement indéfini ?
--
Franck Branjonneau <fasbjx (AT) free (DOT) fr>
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Tue Oct 18, 2005 11:34 pm Post subject: Re: #define : Alias de fonctions ou de champ d'une structure |
|
|
On Tue, 18 Oct 2005 17:07:51 +0200, Stephane Wirtel
<com.descasoft (AT) wirtel (DOT) stephane>:
| Quote: | A quoi vois-tu que cela est du C ?
|
typedef struct StructFun { ... } StructFun;
Idiome classique en C. Je crois bien que c'est interdit en C++.
| Quote: | Et ça, j'espère que même les programmeurs C ne le font plus.
Tu es en train de dire que partout dans ton programme, l'identifiant
"Age" est un synonyme de "age".
Dans l'exemple donné, il était demandé si il était possible d'implémenter
des alias sur des champs.
|
Certes. Mais "#define" est trop bourrin. Maintenant, tu fais ce que tu
veux, du moment que tu ne me demandes pas de faire fonctionner le
résultat.
| Quote: | Une structure est directement public que cela soit les méthodes ou les champs.
|
Il n'y a pas de notion de "structure" en C++.
Tu peux décréter que tous les membres d'une classe sont publics, mais
c'est tout de même relativement rare.
|
|
| Back to top |
|
 |
kanze Guest
|
Posted: Wed Oct 19, 2005 7:34 am Post subject: Re: #define : Alias de fonctions ou de champ d'une structure |
|
|
Fabien LE LEZ wrote:
| Quote: | On Tue, 18 Oct 2005 17:07:51 +0200, Stephane Wirtel
[email]com.descasoft (AT) wirtel (DOT) step[/email]hane>:
A quoi vois-tu que cela est du C ?
typedef struct StructFun { ... } StructFun;
Idiome classique en C. Je crois bien que c'est interdit en
C++.
|
Il y a des règles spéciales pour le permettre. Qui sert dans le
cas où il faut écrire des en-têtes communs aux deux langages.
Autrement, effectivement, on n'écrit pas ça en C++ pûr, même si
c'est permis.
| Quote: | Et ça, j'espère que même les programmeurs C ne le font
plus. Tu es en train de dire que partout dans ton
programme, l'identifiant "Age" est un synonyme de "age".
|
Dis-le plus clairement -- la portée de l'alias n'est pas que la
struct, mais partout. Le #define fout la merde chez d'autres.
| Quote: | Dans l'exemple donné, il était demandé si il était possible
d'implémenter des alias sur des champs.
Certes. Mais "#define" est trop bourrin. Maintenant, tu fais
ce que tu veux, du moment que tu ne me demandes pas de faire
fonctionner le résultat.
Une structure est directement public que cela soit les
méthodes ou les champs.
Il n'y a pas de notion de "structure" en C++.
|
Mais si : §9/4 : « A structure is a class definewith the
class-key struct; [...] ». En revanche, je ne crois pas que la
norme utilise le mot autrement, même si elle le définit.
Note que : 1) une structure « estUne » classe, l'ensemble des
structures dans un programme est un sous-ensemble des classes,
et 2) dans la declaration anticipée « struct X ; », tu ne sais
pas si X est une structure ou non (mais vue que le concepte ne
sert pas, bien qu'étant défini, tu t'en fous).
Plus amusant, une « POD-struct » n'est pas forcement une
structure. C'est une classe qui n'est pas une union, et qui
remplit un certain nombre d'autres conditions.
AMHA : la nomenclature ici n'est pas aussi bien qu'elle pourrait
l'être. Je ne vois pas l'intérêt de définir « structure » ; la
phrase citée ci-dessus pourrait aussi bien dire : « If a class
is defined with the class-key struct, its members and base
classes a public by default. » Et personellement, je n'aurais
pas dit qu'une union est une classe, pour ensuite dresser la
liste des différences, mais l'inverse : j'aurais défini union
comme une catégorie de type à part, pour ensuite citer les
ressemblances qu'elle a avec des classes.
| Quote: | Tu peux décréter que tous les membres d'une classe sont
publics, mais c'est tout de même relativement rare.
|
Ça dépend. Je le fais chaque fois que je dois interfacer avec du
code C. Ce qui n'est pas si rare que ça ; l'API de ma
plate-forme est spécifiée en C.
--
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
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Wed Oct 19, 2005 9:40 am Post subject: Re: #define : Alias de fonctions ou de champ d'une structure |
|
|
On 19 Oct 2005 00:34:47 -0700, "kanze" <kanze (AT) gabi-soft (DOT) fr>:
| Quote: | AMHA : la nomenclature ici n'est pas aussi bien qu'elle pourrait
l'être. Je ne vois pas l'intérêt de définir « structure »
|
Franchement, quitte à récupérer l'héritage de C, je trouve qu'on
aurait aussi bien fait de garder juste la notion de "structure", avec
le mot-clé "struct", plutôt qu'avoir les deux mots "presque synonymes"
que sont "struct" et "class".
En l'état actuel du langage, on pourrait se passer totalement du
mot-clé "class" sans perte de fonctionnalité.
|
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Wed Oct 19, 2005 8:36 pm Post subject: Re: #define : Alias de fonctions ou de champ d'une structure |
|
|
Fabien LE LEZ wrote:
| Quote: | On 19 Oct 2005 00:34:47 -0700, "kanze" <kanze (AT) gabi-soft (DOT) fr>:
AMHA : la nomenclature ici n'est pas aussi bien qu'elle
pourrait l'être. Je ne vois pas l'intérêt de définir «
structure »
Franchement, quitte à récupérer l'héritage de C, je trouve
qu'on aurait aussi bien fait de garder juste la notion de
"structure", avec le mot-clé "struct", plutôt qu'avoir les
deux mots "presque synonymes" que sont "struct" et "class".
|
Je ne me rappelle plus la raisonnement, mais j'ai bien lu
quelque part qu'on avait considéré la possibilité, et que la
décision de fusionner les deux conceptes était intentionnelle.
--
James Kanze mailto: [email]james.kanze (AT) free (DOT) fr[/email]
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
Marc Boyer Guest
|
Posted: Thu Oct 20, 2005 7:27 pm Post subject: Re: #define : Alias de fonctions ou de champ d'une structure |
|
|
Le 18-10-2005, Fabien LE LEZ <gramster (AT) gramster (DOT) com> a écrit :
| Quote: | On Tue, 18 Oct 2005 15:04:00 +0200, Stephane Wirtel
[email]com.descasoft (AT) wirtel (DOT) step[/email]hane>:
typedef struct StructFun {
Ça, c'est sans aucun doute du C.
int age;
[SNIP]
- pour une variable, c'est plus compliqué (Peut-être peut-on faire
quelque chose avec un "union" ?), mais a priori le cas est très rare
de toute façons, puisque généralement, une variable membre est privée.
|
J'ai lancé la discussion sur fclc, et il semble qu'on pourrait
en effet faire
typedef struct StructFun {
union {
int age;
int Age;
};
} StructFun;
pour avoir un alias de age qui serait Age uniquement dans
la portée de StructFun.
Mais bon, ça discute ferme ;-)
Marc Boyer
--
À vélo, prendre une rue à contre-sens est moins dangeureux
que prendre un boulevard dans le sens légal. À qui la faute ?
|
|
| Back to top |
|
 |
kanze Guest
|
Posted: Fri Oct 21, 2005 6:31 am Post subject: Re: #define : Alias de fonctions ou de champ d'une structure |
|
|
Marc Boyer wrote:
| Quote: | Le 18-10-2005, Fabien LE LEZ <gramster (AT) gramster (DOT) com> a écrit :
On Tue, 18 Oct 2005 15:04:00 +0200, Stephane Wirtel
[email]com.descasoft (AT) wirtel (DOT) step[/email]hane>:
typedef struct StructFun {
Ça, c'est sans aucun doute du C.
int age;
[SNIP]
- pour une variable, c'est plus compliqué (Peut-être peut-on
faire quelque chose avec un "union" ?), mais a priori le cas
est très rare de toute façons, puisque généralement, une
variable membre est privée.
J'ai lancé la discussion sur fclc, et il semble qu'on
pourrait en effet faire
typedef struct StructFun {
union {
int age;
int Age;
};
} StructFun;
pour avoir un alias de age qui serait Age uniquement dans la
portée de StructFun.
Mais bon, ça discute ferme
|
Il faudrait que j'y jette un coup d'oeil, mais je ne sais pas ce
qu'il y a à discuter. Selon la norme, si la dernière affectation
ou initialisation est à age, tout accès à Age est un
comportement indéfini, et vice versa. Dans la pratique, c'est
une technique répandue et acceptée, au point qu'aucun
compilateur n'oserait ne pas le supporter. (Je crois, en tout
cas. G++ m'a étonné une ou deux fois dans la passée avec ce
qu'il a réfusé.)
--
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
|
|
| Back to top |
|
 |
Marc Boyer Guest
|
Posted: Fri Oct 21, 2005 7:04 am Post subject: Re: #define : Alias de fonctions ou de champ d'une structure |
|
|
kanze <kanze (AT) gabi-soft (DOT) fr> a écrit :
| Quote: | J'ai lancé la discussion sur fclc, et il semble qu'on
pourrait en effet faire
typedef struct StructFun {
union {
int age;
int Age;
};
} StructFun;
pour avoir un alias de age qui serait Age uniquement dans la
portée de StructFun.
Mais bon, ça discute ferme ;-)
Il faudrait que j'y jette un coup d'oeil, mais je ne sais pas ce
qu'il y a à discuter. Selon la norme, si la dernière affectation
ou initialisation est à age, tout accès à Age est un
comportement indéfini, et vice versa.
|
Avec un bémol posé sur les structures qui commencent par
les "même" champs. Ce qui fait que les structures ont un
traitement privilégié sur les types de base.
| Quote: | Dans la pratique, c'est
une technique répandue et acceptée, au point qu'aucun
compilateur n'oserait ne pas le supporter. (Je crois, en tout
cas. G++ m'a étonné une ou deux fois dans la passée avec ce
qu'il a réfusé.)
|
Oui, dans la pratique, je suis confiant.
Marc Boyer
--
À vélo, prendre une rue à contre-sens est moins dangereux
que prendre un boulevard dans le sens légal. À qui la faute ?
|
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Fri Oct 21, 2005 12:56 pm Post subject: Re: #define : Alias de fonctions ou de champ d'une structure |
|
|
"kanze" <kanze (AT) gabi-soft (DOT) fr> writes:
[...]
| Quote: | typedef struct StructFun {
union {
int age;
int Age;
};
} StructFun;
pour avoir un alias de age qui serait Age uniquement dans la
portée de StructFun.
Mais bon, ça discute ferme ;-)
Il faudrait que j'y jette un coup d'oeil, mais je ne sais pas ce
qu'il y a à discuter. Selon la norme, si la dernière affectation
ou initialisation est à age, tout accès à Age est un
comportement indéfini, et vice versa. Dans la pratique, c'est
une technique répandue et acceptée, au point qu'aucun
compilateur n'oserait ne pas le supporter. (Je crois, en tout
cas. G++ m'a étonné une ou deux fois dans la passée avec ce
qu'il a réfusé.)
|
GCC documente que c'est un fonctionnement « normal » -- au sens qu'il
garantit la sémantique.
-- Gaby
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|