C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

static const
Goto page 1, 2, 3  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Loïc Joly
Guest





PostPosted: Fri May 20, 2005 9:11 pm    Post subject: static const Reply with quote



Bonjour,

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.

--
Loïc
Back to top
Loïc Joly
Guest





PostPosted: Fri May 20, 2005 9:53 pm    Post subject: Re: static const Reply with quote



Gabriel Dos Reis a écrit :
Quote:
Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> writes:

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

C'est ce point qui me gêne, d'autant plus qu'un membre static const de
classe n'appartient pas vraiment à la class. Quelle en est la motivation ?

Quote:
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++).

Je suis d'accord avec ces arguments, et c'est le fait qu'ils ne
s'appliquent pas aux membres static const de classes pour lequel je ne
vois pas d'argument.


En l'occurence, le problème que j'ai avec ça est que je suis en train de
faire une macro qui, à partir de :

RICH_ENUM(Couleur, (Rouge)(Vert)(Bleu));

Génère du code dans le style (inspiré du papier n1719 de Sutter):

class Couleur
{
private:
enum MyEnum {Rouge_, Vert_, Bleu_, Invalid};
MyEnum myValue;
public:
static Couleur const Rouge, Vert, Bleu;
explicit Couleur(MyEnum val) : myValue( val ) { }
};

Couleur const Couleur::Rouge (Couleur::Rouge_);
Couleur const Couleur::Vert (Couleur::Vert_);
Couleur const Couleur::Bleu (Couleur::Bleu_);



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.

--
Loïc

Back to top
Horst Kraemer
Guest





PostPosted: Fri May 20, 2005 10:21 pm    Post subject: Re: static const Reply with quote



Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> wrote:

Quote:
Bonjour,

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 ?

Parce que les significations de "static" dans

static int const i;

et dans

struct A
{
static int const i;
}

n'ont pas de relation entre elles. Stroustrup a préféré d'utiliser de
nouveau le mot clé "static" du langage C dans un autre contexte au
lieu d'inventer un nouveau mot clé.

static int const i;

est une variable qui n'est visible que dans le fichier dans lequel se
trouve la définition. Alors il y deux "::i". Un dans a.cpp et un dans
b.cpp avec deux définitions indépendantes pour chacun, tandis qu`il ne
peut y a voir qu`une seule définition pour le membre A::i, qui n'est
pas "static" dans le sens dans lequel ::i est "static".

--
Horst

--
Lâche pas la patate!

Back to top
Gabriel Dos Reis
Guest





PostPosted: Fri May 20, 2005 10:38 pm    Post subject: Re: static const Reply with quote

Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> writes:

Quote:
Bonjour,

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.

-- Gaby

Back to top
Gabriel Dos Reis
Guest





PostPosted: Fri May 20, 2005 11:52 pm    Post subject: Re: static const Reply with quote

Horst Kraemer <h-kraemer (AT) lycos (DOT) de> writes:

[...]

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

Parce que les significations de "static" dans

static int const i;

et dans

struct A
{
static int const i;
}

n'ont pas de relation entre elles. Stroustrup a préféré d'utiliser de
nouveau le mot clé "static" du langage C dans un autre contexte au
lieu d'inventer un nouveau mot clé.

En réalité, il a préféré utilisé « static » dans son sens originel
(une seule instance dans le programme).

-- Gaby

Back to top
Gabriel Dos Reis
Guest





PostPosted: Sat May 21, 2005 12:47 am    Post subject: Re: static const Reply with quote

Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> writes:

Quote:
Gabriel Dos Reis a écrit :
Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> writes:
| Bonjour,
| | 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.

C'est ce point qui me gêne, d'autant plus qu'un membre static const de
classe n'appartient pas vraiment à la class. Quelle en est la
motivation ?

Je crois que les membres statiques de classe appartiennent à la classe :-)

Quote:
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++).

Je suis d'accord avec ces arguments, et c'est le fait qu'ils ne
s'appliquent pas aux membres static const de classes pour lequel je ne
vois pas d'argument.

l'argument comme je l'ai dit plus haut est que les membres ont
un linkage extern et non interne -- pense au fait que les classes sont
incluses typiquement dans les en-têtes et à la règle ODR.

Quote:


En l'occurence, le problème que j'ai avec ça est que je suis en train
de faire une macro qui, à partir de :

RICH_ENUM(Couleur, (Rouge)(Vert)(Bleu));

Génère du code dans le style (inspiré du papier n1719 de Sutter):

class Couleur
{
private:
enum MyEnum {Rouge_, Vert_, Bleu_, Invalid};
MyEnum myValue;
public:
static Couleur const Rouge, Vert, Bleu;
explicit Couleur(MyEnum val) : myValue( val ) { }
};

Couleur const Couleur::Rouge (Couleur::Rouge_);
Couleur const Couleur::Vert (Couleur::Vert_);
Couleur const Couleur::Bleu (Couleur::Bleu_);

Typiquement, ces définitions vont dans un .C.

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

Hum. Si tu autorise que des membres de classe puissent avoir un
linkage interne, il faudra :
(1) donner une syntaxe,
(2) reformuler l'ODR.

Je n'ai de solution pour aucun des deux problèmes.

-- Gaby

Back to top
Jean-Marc Bourguet
Guest





PostPosted: Sat May 21, 2005 6:31 am    Post subject: Re: static const Reply with quote

Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> writes:

Quote:
Bonjour,

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

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
Jean-Marc Bourguet
Guest





PostPosted: Sat May 21, 2005 6:38 am    Post subject: Re: static const Reply with quote

Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> writes:

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

template <typename T>
class Couleur_Impl {
enum MyEnum {Rouge_, Vert_, Bleu_, Couleur_Impl_Invalid};
MyEnum myValue;
public:
static Couleur const Rouge, Vert, Bleu;
explicit Couleur(MyEnum val) : myValue( val ) { }
};


template <typename T>
Couleur_Impl const Couleur::Rouge (Couleur::Rouge_);
template <typename T>
Couleur_Impl const Couleur::Vert (Couleur::Vert_);
template <typename T>
Couleur_Impl const Couleur::Bleu (Couleur::Bleu_);

typedef Couleur_Impl<void> Couleur;

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
Gabriel Dos Reis
Guest





PostPosted: Sat May 21, 2005 1:52 pm    Post subject: Re: static const Reply with quote

Jean-Marc Bourguet <jm (AT) bourguet (DOT) org> writes:

Quote:
Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) 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.

-- Gaby

Back to top
Gabriel Dos Reis
Guest





PostPosted: Sat May 21, 2005 1:53 pm    Post subject: Re: static const Reply with quote

Jean-Marc Bourguet <jm (AT) bourguet (DOT) org> writes:

Quote:
Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> writes:

Bonjour,

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 » Wink
Il aura (presque) toujours besoin de mettre la définition quelque
part, et je crois que c'est ça qui pose problème.

-- Gaby

Back to top
Loïc Joly
Guest





PostPosted: Sun May 22, 2005 6:59 pm    Post subject: Re: static const Reply with quote

Jean-Marc Bourguet a écrit :
Quote:

Si tu insistes réellement, tu peux abuser des templates:

Merci, cet abus me donne le résultat que j'escomptais...

La seule question qui me reste, c'est "oserais-je admettre un jour que
j'ai écrit ce genre de code ?" ;)

--
Loïc

Back to top
Jean-Marc Bourguet
Guest





PostPosted: Sun May 22, 2005 7:13 pm    Post subject: Re: static const Reply with quote

Gabriel Dos Reis <gdr (AT) integrable-solutions (DOT) net> writes:

Quote:
Jean-Marc Bourguet <jm (AT) bourguet (DOT) org> writes:

| Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) 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.

anonyme je suppose. Ça marche tant qu'on ne prend pas les
adresses des constantes; relativement raisonnable comme
contrainte dans ce contexte.

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
James Kanze
Guest





PostPosted: Sun May 22, 2005 7:40 pm    Post subject: Re: static const Reply with quote

Gabriel Dos Reis wrote:
Quote:
Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) 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.

Ce qui n'explique pas tout, loin de là.

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. Et si on a besoin
d'une règle spéciale, permettre une initialisation dans
plusieurs unités de compilation fait bien l'affaire aussi ; en
fin de compte, c'est ce qui se passe aujourd'hui avec des
templates.

En fin de compte, la règle que le const implique une absense de
linkage est plutôt une manque d'orthogonalité gratuite.

--
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
Gabriel Dos Reis
Guest





PostPosted: Sun May 22, 2005 8:52 pm    Post subject: Re: static const Reply with quote

Jean-Marc Bourguet <jm (AT) bourguet (DOT) org> writes:

Quote:
Gabriel Dos Reis <gdr (AT) integrable-solutions (DOT) net> writes:

Jean-Marc Bourguet <jm (AT) bourguet (DOT) org> writes:

| Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) 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.

anonyme je suppose.

Pas vraiment... Dans un namespace ordinaire, je pensais.

Quote:
Ça marche tant qu'on ne prend pas les
adresses des constantes; relativement raisonnable comme
contrainte dans ce contexte.

Cette contrainte ne s'applique que pour la solution avec les classes,
et pas aux namespaces.

-- Gaby

Back to top
Gabriel Dos Reis
Guest





PostPosted: Sun May 22, 2005 8:52 pm    Post subject: Re: static const Reply with quote

Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> writes:

Quote:
Jean-Marc Bourguet a écrit :
Si tu insistes réellement, tu peux abuser des templates:

Merci, cet abus me donne le résultat que j'escomptais...

La seule question qui me reste, c'est "oserais-je admettre un jour que
j'ai écrit ce genre de code ?" Wink

non, je présume ;-)

-- Gaby

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2, 3  Next
Page 1 of 3

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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.