Jean-Marc Bourguet writes:
| Loïc Joly writes:
|
| > Et qu'à cause du problème de linkage externe, je me trouve obligé de
| > demander à l'utilisateur de saisir dans le .h :
| > DECLARE_RICH_ENUM(Couleur, (Rouge)(Vert)(Bleu));
| >
| > Et dans un .cpp :
| > IMPLEMENT_RICH_ENUM(Couleur, (Rouge)(Vert)(Bleu));
| >
| > Ce qui fait une lourdeur et une duplication de code
| > qui me gênent, et pour lesquelles je n'ai pas trouvé
| > d'alternative.
|
| Si tu insistes réellement, tu peux abuser des templates:
ou définir les couleurs dans un namespace.
Jean-Marc Bourguet <jm@bourguet.org> writes:
| Loïc Joly <loic.actarus.joly@wanadoo.fr> writes:
|
| > Et qu'à cause du problème de linkage externe, je me trouve obligé de
| > demander à l'utilisateur de saisir dans le .h :
| > DECLARE_RICH_ENUM(Couleur, (Rouge)(Vert)(Bleu));
| >
| > Et dans un .cpp :
| > IMPLEMENT_RICH_ENUM(Couleur, (Rouge)(Vert)(Bleu));
| >
| > Ce qui fait une lourdeur et une duplication de code
| > qui me gênent, et pour lesquelles je n'ai pas trouvé
| > d'alternative.
|
| Si tu insistes réellement, tu peux abuser des templates:
ou définir les couleurs dans un namespace.
Jean-Marc Bourguet writes:
| Loïc Joly writes:
|
| > Et qu'à cause du problème de linkage externe, je me trouve obligé de
| > demander à l'utilisateur de saisir dans le .h :
| > DECLARE_RICH_ENUM(Couleur, (Rouge)(Vert)(Bleu));
| >
| > Et dans un .cpp :
| > IMPLEMENT_RICH_ENUM(Couleur, (Rouge)(Vert)(Bleu));
| >
| > Ce qui fait une lourdeur et une duplication de code
| > qui me gênent, et pour lesquelles je n'ai pas trouvé
| > d'alternative.
|
| Si tu insistes réellement, tu peux abuser des templates:
ou définir les couleurs dans un namespace.
Loïc Joly writes:
| Je me demande pourquoi dans le code suivant :
| // a.h
| int const i = 42;
| class A { static int const i;};
| int const A::i = 42;
| // a.cpp
| #include "a.h"
| // b.cpp
| #include "a.h"
| Pourquoi n'y a-t-il pas de problèmes de définition multiple
| pour i alors qu'il y en a pour A::i ?
| Je sais que c'est ce que demande le standard :
| Static data members of a class in namespace scope have
| external linkage (3.5). A local class shall not have static
| data members.
| Mais je ne comprends pas vraiment la motivation de cette
| différence.
De manière générale, les membres de classe ont un linkage
externe. En ce qui concerne const à portée de namespace, il y
a une discussion dans D&E que j'ai citée plusieurs fois dans
ce groupe (à propos de la différence de "const" entre C et
C++). Page 90:
[...] In the meantime, I had experimented further with const in C
with Classes and found that const was a useful alternative to macros
for representing constants only if global consts were implicitly
local to their compilation unit. Only in that case could the
compiler easily deduce that their value really didn't change.
Knowing that allows us to use simple consts in constant expressions
and to avoid allocating space for such constants. C did not adopt
this rule.
[...] This makes consts far less useful in C than in C++ and leaves
C dependent on the preprocessor while C++ programmers can use
properly typed and scoped consts.
Loïc Joly <loic.actarus.joly@wanadoo.fr> writes:
| Je me demande pourquoi dans le code suivant :
| // a.h
| int const i = 42;
| class A { static int const i;};
| int const A::i = 42;
| // a.cpp
| #include "a.h"
| // b.cpp
| #include "a.h"
| Pourquoi n'y a-t-il pas de problèmes de définition multiple
| pour i alors qu'il y en a pour A::i ?
| Je sais que c'est ce que demande le standard :
| Static data members of a class in namespace scope have
| external linkage (3.5). A local class shall not have static
| data members.
| Mais je ne comprends pas vraiment la motivation de cette
| différence.
De manière générale, les membres de classe ont un linkage
externe. En ce qui concerne const à portée de namespace, il y
a une discussion dans D&E que j'ai citée plusieurs fois dans
ce groupe (à propos de la différence de "const" entre C et
C++). Page 90:
[...] In the meantime, I had experimented further with const in C
with Classes and found that const was a useful alternative to macros
for representing constants only if global consts were implicitly
local to their compilation unit. Only in that case could the
compiler easily deduce that their value really didn't change.
Knowing that allows us to use simple consts in constant expressions
and to avoid allocating space for such constants. C did not adopt
this rule.
[...] This makes consts far less useful in C than in C++ and leaves
C dependent on the preprocessor while C++ programmers can use
properly typed and scoped consts.
Loïc Joly writes:
| Je me demande pourquoi dans le code suivant :
| // a.h
| int const i = 42;
| class A { static int const i;};
| int const A::i = 42;
| // a.cpp
| #include "a.h"
| // b.cpp
| #include "a.h"
| Pourquoi n'y a-t-il pas de problèmes de définition multiple
| pour i alors qu'il y en a pour A::i ?
| Je sais que c'est ce que demande le standard :
| Static data members of a class in namespace scope have
| external linkage (3.5). A local class shall not have static
| data members.
| Mais je ne comprends pas vraiment la motivation de cette
| différence.
De manière générale, les membres de classe ont un linkage
externe. En ce qui concerne const à portée de namespace, il y
a une discussion dans D&E que j'ai citée plusieurs fois dans
ce groupe (à propos de la différence de "const" entre C et
C++). Page 90:
[...] In the meantime, I had experimented further with const in C
with Classes and found that const was a useful alternative to macros
for representing constants only if global consts were implicitly
local to their compilation unit. Only in that case could the
compiler easily deduce that their value really didn't change.
Knowing that allows us to use simple consts in constant expressions
and to avoid allocating space for such constants. C did not adopt
this rule.
[...] This makes consts far less useful in C than in C++ and leaves
C dependent on the preprocessor while C++ programmers can use
properly typed and scoped consts.
James Kanze writes:
[...]
| Ce qui n'explique pas tout, loin de là.
mais, j'avais anticipé que tu allais completer.
| D'abord, évidemment, ce qui rend const moins utile en C,
| c'est le fait qu'on ne peut pas s'en servir dans une
| expression entière const. Indépendamment de linkage et al.
| Pour la reste, si c'est évident qu'une const avec linkage
| externe, qui n'est initialisée que dans une seule unité de
| traduction, ne peut pas vraiment remplacé les #define, il me
| semble bien moins évident que c'est un problème réel : il
| suffit de déclarer le const static, et ça marche.
Avec beaucoup de lourdeur syntaxtique, on peut arriver à
beaucoup de choses.
Après on peut se demander si les cas majoritaires doivent
nécessiter la même lourdeur que les autres.
Enfin, comme je l'ai déjà fait observé Ni BS ni DMR n'ont
jamais aimé ou envisagé que « static » devrait avoir quoi que
ce soit vace « linkage > -- en réalité, aucun des deux n'aime
ce concept.
James Kanze <kanze@none> writes:
[...]
| Ce qui n'explique pas tout, loin de là.
mais, j'avais anticipé que tu allais completer.
| D'abord, évidemment, ce qui rend const moins utile en C,
| c'est le fait qu'on ne peut pas s'en servir dans une
| expression entière const. Indépendamment de linkage et al.
| Pour la reste, si c'est évident qu'une const avec linkage
| externe, qui n'est initialisée que dans une seule unité de
| traduction, ne peut pas vraiment remplacé les #define, il me
| semble bien moins évident que c'est un problème réel : il
| suffit de déclarer le const static, et ça marche.
Avec beaucoup de lourdeur syntaxtique, on peut arriver à
beaucoup de choses.
Après on peut se demander si les cas majoritaires doivent
nécessiter la même lourdeur que les autres.
Enfin, comme je l'ai déjà fait observé Ni BS ni DMR n'ont
jamais aimé ou envisagé que « static » devrait avoir quoi que
ce soit vace « linkage > -- en réalité, aucun des deux n'aime
ce concept.
James Kanze writes:
[...]
| Ce qui n'explique pas tout, loin de là.
mais, j'avais anticipé que tu allais completer.
| D'abord, évidemment, ce qui rend const moins utile en C,
| c'est le fait qu'on ne peut pas s'en servir dans une
| expression entière const. Indépendamment de linkage et al.
| Pour la reste, si c'est évident qu'une const avec linkage
| externe, qui n'est initialisée que dans une seule unité de
| traduction, ne peut pas vraiment remplacé les #define, il me
| semble bien moins évident que c'est un problème réel : il
| suffit de déclarer le const static, et ça marche.
Avec beaucoup de lourdeur syntaxtique, on peut arriver à
beaucoup de choses.
Après on peut se demander si les cas majoritaires doivent
nécessiter la même lourdeur que les autres.
Enfin, comme je l'ai déjà fait observé Ni BS ni DMR n'ont
jamais aimé ou envisagé que « static » devrait avoir quoi que
ce soit vace « linkage > -- en réalité, aucun des deux n'aime
ce concept.
Jean-Marc Bourguet writes:
| Loïc Joly writes:
| > Je me demande pourquoi dans le code suivant :
| > // a.h
| > int const i = 42;
| > class A { static int const i;};
| > int const A::i = 42;
| > // a.cpp
| > #include "a.h"
| > // b.cpp
| > #include "a.h"
| En passant je rappelle que
| class A { static int const i = 42;};
| ne poserait pas de problème (mais n'est possible que pour
| les entiers).
mais c'est un « misfeature » ;-)
Jean-Marc Bourguet <jm@bourguet.org> writes:
| Loïc Joly <loic.actarus.joly@wanadoo.fr> writes:
| > Je me demande pourquoi dans le code suivant :
| > // a.h
| > int const i = 42;
| > class A { static int const i;};
| > int const A::i = 42;
| > // a.cpp
| > #include "a.h"
| > // b.cpp
| > #include "a.h"
| En passant je rappelle que
| class A { static int const i = 42;};
| ne poserait pas de problème (mais n'est possible que pour
| les entiers).
mais c'est un « misfeature » ;-)
Jean-Marc Bourguet writes:
| Loïc Joly writes:
| > Je me demande pourquoi dans le code suivant :
| > // a.h
| > int const i = 42;
| > class A { static int const i;};
| > int const A::i = 42;
| > // a.cpp
| > #include "a.h"
| > // b.cpp
| > #include "a.h"
| En passant je rappelle que
| class A { static int const i = 42;};
| ne poserait pas de problème (mais n'est possible que pour
| les entiers).
mais c'est un « misfeature » ;-)
writes:
| Gabriel Dos Reis wrote:
| > Jean-Marc Bourguet writes:
| > | Loïc Joly writes:
| > | > Je me demande pourquoi dans le code suivant :
| > | > // a.h
| > | > int const i = 42;
| > | > class A { static int const i;};
| > | > int const A::i = 42;
| > | > // a.cpp
| > | > #include "a.h"
| > | > // b.cpp
| > | > #include "a.h"
| > | En passant je rappelle que
| > | class A { static int const i = 42;};
| > | ne poserait pas de problème (mais n'est possible que
| > | pour les entiers).
| > mais c'est un « misfeature » ;-)
| J'en conviens ; c'est même plutôt affreux, quand on y pense.
| Mais il réponds à un besoin réel. Comment ferais-tu à
| déclarer une constante à portée de la classe, qui a le bon
| type, et qui est aussi disponible dans la définition de la
| classe ?
Peut-être que le besoin est réel, mais ça marche pas.
(1) il faut quand même donner la définition quelque part dans le
programme
(2) on ne peut le faire que si la variable est const ;
(3) en plus il faut que ce soit de type entier.
kanze@gabi-soft.fr writes:
| Gabriel Dos Reis wrote:
| > Jean-Marc Bourguet <jm@bourguet.org> writes:
| > | Loïc Joly <loic.actarus.joly@wanadoo.fr> writes:
| > | > Je me demande pourquoi dans le code suivant :
| > | > // a.h
| > | > int const i = 42;
| > | > class A { static int const i;};
| > | > int const A::i = 42;
| > | > // a.cpp
| > | > #include "a.h"
| > | > // b.cpp
| > | > #include "a.h"
| > | En passant je rappelle que
| > | class A { static int const i = 42;};
| > | ne poserait pas de problème (mais n'est possible que
| > | pour les entiers).
| > mais c'est un « misfeature » ;-)
| J'en conviens ; c'est même plutôt affreux, quand on y pense.
| Mais il réponds à un besoin réel. Comment ferais-tu à
| déclarer une constante à portée de la classe, qui a le bon
| type, et qui est aussi disponible dans la définition de la
| classe ?
Peut-être que le besoin est réel, mais ça marche pas.
(1) il faut quand même donner la définition quelque part dans le
programme
(2) on ne peut le faire que si la variable est const ;
(3) en plus il faut que ce soit de type entier.
writes:
| Gabriel Dos Reis wrote:
| > Jean-Marc Bourguet writes:
| > | Loïc Joly writes:
| > | > Je me demande pourquoi dans le code suivant :
| > | > // a.h
| > | > int const i = 42;
| > | > class A { static int const i;};
| > | > int const A::i = 42;
| > | > // a.cpp
| > | > #include "a.h"
| > | > // b.cpp
| > | > #include "a.h"
| > | En passant je rappelle que
| > | class A { static int const i = 42;};
| > | ne poserait pas de problème (mais n'est possible que
| > | pour les entiers).
| > mais c'est un « misfeature » ;-)
| J'en conviens ; c'est même plutôt affreux, quand on y pense.
| Mais il réponds à un besoin réel. Comment ferais-tu à
| déclarer une constante à portée de la classe, qui a le bon
| type, et qui est aussi disponible dans la définition de la
| classe ?
Peut-être que le besoin est réel, mais ça marche pas.
(1) il faut quand même donner la définition quelque part dans le
programme
(2) on ne peut le faire que si la variable est const ;
(3) en plus il faut que ce soit de type entier.
Et alors ? Je n'ai jamais dit que c'était élégant. Je n'aime
pas, mais dans la mesure qu'on ne m'offre rien d'autre.
[...]
(3) en plus il faut que ce soit de type entier.
C'est pire que ton point 1), j'en conviens. Mais la réponse en
est la même : dans la mesure où on ne m'offre rien d'autre...
Et alors ? Je n'ai jamais dit que c'était élégant. Je n'aime
pas, mais dans la mesure qu'on ne m'offre rien d'autre.
[...]
(3) en plus il faut que ce soit de type entier.
C'est pire que ton point 1), j'en conviens. Mais la réponse en
est la même : dans la mesure où on ne m'offre rien d'autre...
Et alors ? Je n'ai jamais dit que c'était élégant. Je n'aime
pas, mais dans la mesure qu'on ne m'offre rien d'autre.
[...]
(3) en plus il faut que ce soit de type entier.
C'est pire que ton point 1), j'en conviens. Mais la réponse en
est la même : dans la mesure où on ne m'offre rien d'autre...