OVH Cloud OVH Cloud

constante static public

5 réponses
Avatar
Nicolas Aunai
salut,


j'ai dans une classe :

static const unsigned int etat_inconnu = 3;


et dans mon cpp :

unsigned int
Automate::operator[](unsigned int indice) const
{
return (indice < nb_etat)? etats[indice]:etat_inconnu;
}

là j'ai un undefined reference to 'etat_inconnu' à l'édition de
liens...

j'ai trouvé la solution, en me disant que ct peut-etre le ':' qui
génait... et j'ai fait

if(indice < nb_etat)
return etats[indice];
else
return etat_inconnu;


et là plus de pb..


seulement si c la solution, je ne vois pas trop l'explication


qui peux me la donner ?

merci

--
Nico,
http://astrosurf.com/nicoastro
messenger : nicolas_aunai@hotmail.com

5 réponses

Avatar
Horst Kraemer
On Thu, 15 Jan 2004 22:51:24 +0100, Nicolas Aunai
wrote:

salut,


j'ai dans une classe :

static const unsigned int etat_inconnu = 3;


et dans mon cpp :

unsigned int
Automate::operator[](unsigned int indice) const
{
return (indice < nb_etat)? etats[indice]:etat_inconnu;
}

là j'ai un undefined reference to 'etat_inconnu' à l'édition de
liens...


parce qu'il manque une *definition*

const unsigned int Automate::etat_inconnu; // sans =3 !

dans ton .cpp.


j'ai trouvé la solution, en me disant que ct peut-etre le ':' qui
génait... et j'ai fait

if(indice < nb_etat)
return etats[indice];
else
return etat_inconnu;

et là plus de pb..

seulement si c la solution, je ne vois pas trop l'explication


Il parait que ton compilateur est rouillé...

--
Horst

Avatar
Nicolas Aunai
Horst Kraemer a pensé très fort :


parce qu'il manque une *definition*

const unsigned int Automate::etat_inconnu; // sans =3 !

dans ton .cpp.



meuh nan ! j'utilise cette même constante 2 lignes plus loin sans
probleme !! et si je chge le code ça marche !


seulement si c la solution, je ne vois pas trop l'explication


Il parait que ton compilateur est rouillé...



quoi ?

--
Nico,
http://astrosurf.com/nicoastro
messenger :


Avatar
Michel Michaud
Dans news:, Nicolas
j'ai dans une classe :

static const unsigned int etat_inconnu = 3;


Avec cette construction, le compilateur¹ est libre de ne pas
exiger la définition de la variable. Ce n'est quand même qu'une
simple déclaration et il faudrait la définition.

et dans mon cpp :

unsigned int
Automate::operator[](unsigned int indice) const
{
return (indice < nb_etat)? etats[indice]:etat_inconnu;
}

là j'ai un undefined reference to 'etat_inconnu' à l'édition de
liens...


Alors c'est normal, il te manque la définition...

j'ai trouvé la solution, en me disant que ct peut-etre le ':' qui
génait... et j'ai fait

if(indice < nb_etat)
return etats[indice];
else
return etat_inconnu;


et là plus de pb..


C'est un « hasard », mais là, il n'exige pas la définition, comme
c'est permis...

seulement si c la solution, je ne vois pas trop l'explication


L'explication est que le compilateur a le droit d'exiger ou non
la définition. Ceci dit, c'est effectivement curieux que l'on
voit la différence dans ce cas. Il faudrait un expert de la
compilation pour comprendre la différence, mais ce que ça dit,
c'est que l'histoire des static const n'est pas aussi directe
que l'on peut penser.

¹ Je dis compilateur ici, mais en fait, c'est l'ensemble
compilateur/éditeur de liens...
--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
Vincent Lascaux
static const unsigned int etat_inconnu = 3;


Avec cette construction, le compilateur¹ est libre de ne pas
exiger la définition de la variable. Ce n'est quand même qu'une
simple déclaration et il faudrait la définition.


Tu veux dire qu'un programme qui ne donne pas la définition de la variable
pourrait etre considéré (a raison) juste par un compilateur et faux par un
autre ?
Je pensais que la norme devait spécifier ce qu'etait du code C++ et ce qui
n'en est pas. Mais en réalité on ne peut pas dire si du code est C++ ou non
sans savoir de quel compilateur on parle ?!

--
Vincent


Avatar
Michel Michaud
Dans news:40085ce7$0$19270$, Vincent
static const unsigned int etat_inconnu = 3;


Avec cette construction, le compilateur¹ est libre de ne pas
exiger la définition de la variable. Ce n'est quand même qu'une
simple déclaration et il faudrait la définition.


Tu veux dire qu'un programme qui ne donne pas la définition de la
variable pourrait etre considéré (a raison) juste par un
compilateur et faux par un autre ?


« In that case [static const int ou enum avec initialisation],
the member can appear in integral constant expressions within
its scope. The member shall still be defined in a namespace
scope if it is used in the program [...] »

Notez le « used »... J'y comprends qu'il faut la définition
seulement si le compilateur doit prendre l'adresse ou utiliser
la variable en tant que telle, plutôt que simplement utiliser la
valeur donnée à l'initialisation en tant que valeur constante.
Mais c'est mon interprétation...

Je pensais que la norme devait spécifier ce qu'etait du code C++ et
ce qui n'en est pas. Mais en réalité on ne peut pas dire si du code
est C++ ou non sans savoir de quel compilateur on parle ?!


Pas vraiment, je crois finalement que les deux versions du code
original sont peut-être correctes. L'interprétation de la norme,
en particulier ce que signifie « used », est un peu difficile...

Le problème vient peut-être des lvalue vs rvalue (un lvalue, dans
le cas du ?:, serait une utilisation au sens de « used »), mais ça
prendrait un expert (Gabriel ? ... à l'aide !) pour confirmer.

En plus, c'est une règle nouvelle de la norme, comme le fait de
pouvoir donner l'initialisation dans la classe. Peut-être que
certains compilateurs ne font pas les choses correctement.

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/