OVH Cloud OVH Cloud

#define : Alias de fonctions ou de champ d'une structure ?

25 réponses
Avatar
Stephane Wirtel
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

10 réponses

1 2 3
Avatar
Fabien LE LEZ
On Tue, 18 Oct 2005 15:04:00 +0200, Stephane Wirtel
:

typedef struct StructFun {


Ça, c'est sans aucun doute 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".

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.

Avatar
Stephane Wirtel
On Tue, 18 Oct 2005 15:04:00 +0200, Stephane Wirtel
:


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.


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.

- 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.


Bonne soirée,

Stéphane


Avatar
Jean-Marc Bourguet
Stephane Wirtel writes:

On Tue, 18 Oct 2005 15:04:00 +0200, Stephane Wirtel
:

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



Avatar
Stephane Wirtel
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.



Avatar
Stephane Wirtel
Stephane Wirtel writes:



On Tue, 18 Oct 2005 15:04:00 +0200, Stephane Wirtel
:


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,





Avatar
Franck Branjonneau
Stephane Wirtel écrivait:

- 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 ?

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



Avatar
Fabien LE LEZ
On Tue, 18 Oct 2005 17:07:51 +0200, Stephane Wirtel
:

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++.

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.

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.


Avatar
kanze
Fabien LE LEZ wrote:
On Tue, 18 Oct 2005 17:07:51 +0200, Stephane Wirtel
:

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.

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.

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.

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



Avatar
Fabien LE LEZ
On 19 Oct 2005 00:34:47 -0700, "kanze" :

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é.

Avatar
James Kanze
Fabien LE LEZ wrote:
On 19 Oct 2005 00:34:47 -0700, "kanze" :


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:
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


1 2 3