 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Nicolas Aunai Guest
|
Posted: Thu Jan 15, 2004 9:51 pm Post subject: constante static public |
|
|
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 : [email]nicolas_aunai (AT) hotmail (DOT) com[/email]
|
|
| Back to top |
|
 |
Horst Kraemer Guest
|
Posted: Fri Jan 16, 2004 1:01 am Post subject: Re: constante static public |
|
|
On Thu, 15 Jan 2004 22:51:24 +0100, Nicolas Aunai
<nicolas.aunai (AT) free (DOT) fr> wrote:
| Quote: | 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.
| Quote: | 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
|
|
| Back to top |
|
 |
Nicolas Aunai Guest
|
Posted: Fri Jan 16, 2004 6:10 am Post subject: Re: constante static public |
|
|
Horst Kraemer a pensé très fort :
| Quote: | 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 !
| Quote: | 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 : [email]nicolas_aunai (AT) hotmail (DOT) com[/email]
|
|
| Back to top |
|
 |
Michel Michaud Guest
|
Posted: Fri Jan 16, 2004 1:15 pm Post subject: Re: constante static public |
|
|
Dans news:mesnews.7d5b7d41.c4235f07.3.1437 (AT) free (DOT) fr, Nicolas
Aunai <nicolas.aunai (AT) free (DOT) fr> a écrit :
| Quote: | 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.
| Quote: | 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...
| Quote: | 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...
| Quote: | 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 [email]mm (AT) gdzid (DOT) com[/email]
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
|
|
| Back to top |
|
 |
Vincent Lascaux Guest
|
Posted: Fri Jan 16, 2004 9:51 pm Post subject: Re: constante static public |
|
|
| Quote: | 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
|
|
| Back to top |
|
 |
Michel Michaud Guest
|
Posted: Sat Jan 17, 2004 5:42 am Post subject: Re: constante static public |
|
|
Dans news:40085ce7$0$19270$626a54ce (AT) news (DOT) free.fr, Vincent
Lascaux <nospam (AT) nospam (DOT) org> a écrit :
| Quote: | 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...
| Quote: | 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 [email]mm (AT) gdzid (DOT) com[/email]
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
|
|
| 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
|
|