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
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/
Dans news:mesnews.7d5b7d41.c4235f07.3.1437@free.fr, 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
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 mm@gdzid.com
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
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
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/
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
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 ?!
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
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/
Dans news:40085ce7$0$19270$626a54ce@news.free.fr, 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 mm@gdzid.com
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
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/