//main.cpp #include "toto.h" int main() { X::f(); }
-- Horst
Anthony Fleury
Michaël Delva wrote:
Bonjour à tous,
j'ai une classe avec des fonctions en 'static'
Je suis obligé d'écrire l'implémentation de ces fonctions dans le même fichier que leur déclaration?
Pas du tout, et un simple test aurait évité d'attendre la réponse d'une personne exterieure. Il ne faut pas confondre fonctions static, qui par héritage du C sont des fonctions dont la portée se réduit au fichier en cours, et fonctions membres static, qui sont elles des fonctions indépendante de toute instance de la classe. La définition d'une telle fonction peut se faire à tout endroit où un membre non static de la classe peut être défini.
Anthony -- "You could be my unintended, choice to live my life extended You should be the one I'll always love, I'll be there as soon as I can But I'm busy mending broken pieces of the life I had before" (C) Muse - Unintended
Michaël Delva wrote:
Bonjour à tous,
j'ai une classe avec des fonctions en 'static'
Je suis obligé d'écrire l'implémentation de ces fonctions dans le même
fichier que leur déclaration?
Pas du tout, et un simple test aurait évité d'attendre la réponse d'une
personne exterieure.
Il ne faut pas confondre fonctions static, qui par héritage du C sont des
fonctions dont la portée se réduit au fichier en cours, et fonctions
membres static, qui sont elles des fonctions indépendante de toute instance
de la classe. La définition d'une telle fonction peut se faire à tout
endroit où un membre non static de la classe peut être défini.
Anthony
--
"You could be my unintended, choice to live my life extended
You should be the one I'll always love, I'll be there as soon as I can
But I'm busy mending broken pieces of the life I had before"
(C) Muse - Unintended
Je suis obligé d'écrire l'implémentation de ces fonctions dans le même fichier que leur déclaration?
Pas du tout, et un simple test aurait évité d'attendre la réponse d'une personne exterieure. Il ne faut pas confondre fonctions static, qui par héritage du C sont des fonctions dont la portée se réduit au fichier en cours, et fonctions membres static, qui sont elles des fonctions indépendante de toute instance de la classe. La définition d'une telle fonction peut se faire à tout endroit où un membre non static de la classe peut être défini.
Anthony -- "You could be my unintended, choice to live my life extended You should be the one I'll always love, I'll be there as soon as I can But I'm busy mending broken pieces of the life I had before" (C) Muse - Unintended
Par contre si je mets les implémentations dans le H, tout fonctionne correctement...
D'où vient le problème?
Anthony Fleury
Michaël Delva wrote:
J'ai testé ;-)
Les implémentations des fonctions sont dans le CPP (Example d'une fonction)
inline char Base64::Encode(unsigned char uc) {
Une fonction inline voit sa portée limitée au fichier en cours, donc il faut qu'elle soit définie dans le .h
D'où vient le problème?
du inline.
Anthony -- "You could be my unintended, choice to live my life extended You should be the one I'll always love, I'll be there as soon as I can But I'm busy mending broken pieces of the life I had before" (C) Muse - Unintended
Michaël Delva wrote:
J'ai testé ;-)
Les implémentations des fonctions sont dans le CPP (Example d'une
fonction)
inline char Base64::Encode(unsigned char uc)
{
Une fonction inline voit sa portée limitée au fichier en cours, donc il faut
qu'elle soit définie dans le .h
D'où vient le problème?
du inline.
Anthony
--
"You could be my unintended, choice to live my life extended
You should be the one I'll always love, I'll be there as soon as I can
But I'm busy mending broken pieces of the life I had before"
(C) Muse - Unintended
Les implémentations des fonctions sont dans le CPP (Example d'une fonction)
inline char Base64::Encode(unsigned char uc) {
Une fonction inline voit sa portée limitée au fichier en cours, donc il faut qu'elle soit définie dans le .h
D'où vient le problème?
du inline.
Anthony -- "You could be my unintended, choice to live my life extended You should be the one I'll always love, I'll be there as soon as I can But I'm busy mending broken pieces of the life I had before" (C) Muse - Unintended
Les implémentations des fonctions sont dans le CPP (Example d'une fonction)
inline char Base64::Encode(unsigned char uc)
Enlève le inline ! Si tu veux inline il faut l'implémentation dans le .h. Ça n'a rien à voir avec le static... (bien que les récentes règles de « linkage » soient particulières)
-- Michel Michaud http://www.gdzid.com FAQ de fr.comp.lang.c++ : http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
Dans news:Xns94EFC6B5C1BA8zoubidamanhotmailcom@212.27.42.70,
Les implémentations des fonctions sont dans le CPP (Example
d'une fonction)
inline char Base64::Encode(unsigned char uc)
Enlève le inline ! Si tu veux inline il faut l'implémentation
dans le .h. Ça n'a rien à voir avec le static... (bien
que les récentes règles de « linkage » soient particulières)
--
Michel Michaud mm@gdzid.com
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
Les implémentations des fonctions sont dans le CPP (Example d'une fonction)
inline char Base64::Encode(unsigned char uc)
Enlève le inline ! Si tu veux inline il faut l'implémentation dans le .h. Ça n'a rien à voir avec le static... (bien que les récentes règles de « linkage » soient particulières)
-- Michel Michaud http://www.gdzid.com FAQ de fr.comp.lang.c++ : http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
Les implémentations des fonctions sont dans le CPP (Example d'une fonction)
inline char Base64::Encode(unsigned char uc) {
Une fonction inline voit sa portée limitée au fichier en cours, donc il faut qu'elle soit définie dans le .h
Pas vraiment il me semble, en tout cas pas pour les fonctions libres où le inline laisse le « external linkage »...
Mais comme ça ne fonctionne pas pour Michaël, soit ce n'est pas le cas pour les fonctions membres, soit son compilateur n'est pas à jour. Je n'ai pas le temps de vérifier ce cas dans la norme, mais à tout le moins, ceci devrait fonctionner :
// A.cpp inline void A() {}
// B.cpp void A();
int main() { A(); }
Évidemment, il est possible que le inline ne soit pas respecté au niveau de la génération du code...
-- Michel Michaud http://www.gdzid.com FAQ de fr.comp.lang.c++ : http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
Dans news:40acef68$0$21569$626a14ce@news.free.fr, Anthony
Michaël Delva wrote:
J'ai testé ;-)
Les implémentations des fonctions sont dans le CPP (Example
d'une fonction)
inline char Base64::Encode(unsigned char uc)
{
Une fonction inline voit sa portée limitée au fichier en cours,
donc il faut qu'elle soit définie dans le .h
Pas vraiment il me semble, en tout cas pas pour les fonctions
libres où le inline laisse le « external linkage »...
Mais comme ça ne fonctionne pas pour Michaël, soit ce n'est pas
le cas pour les fonctions membres, soit son compilateur n'est
pas à jour. Je n'ai pas le temps de vérifier ce cas dans la
norme, mais à tout le moins, ceci devrait fonctionner :
// A.cpp
inline void A()
{}
// B.cpp
void A();
int main()
{
A();
}
Évidemment, il est possible que le inline ne soit pas
respecté au niveau de la génération du code...
--
Michel Michaud mm@gdzid.com
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
Les implémentations des fonctions sont dans le CPP (Example d'une fonction)
inline char Base64::Encode(unsigned char uc) {
Une fonction inline voit sa portée limitée au fichier en cours, donc il faut qu'elle soit définie dans le .h
Pas vraiment il me semble, en tout cas pas pour les fonctions libres où le inline laisse le « external linkage »...
Mais comme ça ne fonctionne pas pour Michaël, soit ce n'est pas le cas pour les fonctions membres, soit son compilateur n'est pas à jour. Je n'ai pas le temps de vérifier ce cas dans la norme, mais à tout le moins, ceci devrait fonctionner :
// A.cpp inline void A() {}
// B.cpp void A();
int main() { A(); }
Évidemment, il est possible que le inline ne soit pas respecté au niveau de la génération du code...
-- Michel Michaud http://www.gdzid.com FAQ de fr.comp.lang.c++ : http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
Fabien LE LEZ
On Thu, 20 May 2004 17:30:14 +0200, Anthony Fleury wrote:
Pas du tout, et un simple test aurait évité d'attendre la réponse d'une personne exterieure.
Un "simple test" aurait permis de savoir comment se comporte son compilateur. Ce n'est pas tout à fait la même chose, même si ça donne une idée de la réponse.
-- ;-) FLL, Epagneul Breton
On Thu, 20 May 2004 17:30:14 +0200, Anthony Fleury
<fleury_anthony@_hotmail_.com> wrote:
Pas du tout, et un simple test aurait évité d'attendre la réponse d'une
personne exterieure.
Un "simple test" aurait permis de savoir comment se comporte son
compilateur. Ce n'est pas tout à fait la même chose, même si ça donne
une idée de la réponse.
On Thu, 20 May 2004 17:30:14 +0200, Anthony Fleury wrote:
Pas du tout, et un simple test aurait évité d'attendre la réponse d'une personne exterieure.
Un "simple test" aurait permis de savoir comment se comporte son compilateur. Ce n'est pas tout à fait la même chose, même si ça donne une idée de la réponse.
-- ;-) FLL, Epagneul Breton
Anthony Fleury
Michel Michaud wrote:
Dans news:40acef68$0$21569$, Anthony
Une fonction inline voit sa portée limitée au fichier en cours, donc il faut qu'elle soit définie dans le .h
Pas vraiment il me semble, en tout cas pas pour les fonctions libres où le inline laisse le « external linkage »...
Mais comme ça ne fonctionne pas pour Michaël, soit ce n'est pas le cas pour les fonctions membres, soit son compilateur n'est pas à jour. Je n'ai pas le temps de vérifier ce cas dans la norme, mais à tout le moins, ceci devrait fonctionner :
Dans la norme ok, mais dans la pratique je n'ai vu que des compilateurs qui avaient un comportement qui faisait que inline entrainait static, c'est à dire réduction de la portée de la fonction.
bash-2.05b$ g++ --version g++ (GCC) 3.2.3 Copyright (C) 2002 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
bash-2.05b$ cat a.cpp b.cpp /* a.cpp */
inline void A() { }
/* b.cpp */
void A();
int main() { A(); } bash-2.05b$ g++ a.cpp b.cpp /tmp/cckOGwEL.o(.text+0x11): In function `main': : undefined reference to `A()' collect2: ld returned 1 exit status bash-2.05b$
C'est aussi le cas sur Visual C++ 5 et 6 sur lesquels j'ai travaillé. Dans ce cas comme dans le cas des templates je prend donc l'habitude de créer des fichiers ayant une extension autre (.Tpp et .inl) et je les inclus dans les .cpp.
À noter que je n'ai jamais testé comeau mais tous ces codes doivent passer sous Comeau bien sûr.
Anthony -- "You could be my unintended, choice to live my life extended You should be the one I'll always love, I'll be there as soon as I can But I'm busy mending broken pieces of the life I had before" (C) Muse - Unintended
Michel Michaud wrote:
Dans news:40acef68$0$21569$626a14ce@news.free.fr, Anthony
Une fonction inline voit sa portée limitée au fichier en cours,
donc il faut qu'elle soit définie dans le .h
Pas vraiment il me semble, en tout cas pas pour les fonctions
libres où le inline laisse le « external linkage »...
Mais comme ça ne fonctionne pas pour Michaël, soit ce n'est pas
le cas pour les fonctions membres, soit son compilateur n'est
pas à jour. Je n'ai pas le temps de vérifier ce cas dans la
norme, mais à tout le moins, ceci devrait fonctionner :
Dans la norme ok, mais dans la pratique je n'ai vu que des compilateurs qui
avaient un comportement qui faisait que inline entrainait static, c'est à
dire réduction de la portée de la fonction.
bash-2.05b$ g++ --version
g++ (GCC) 3.2.3
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
bash-2.05b$ cat a.cpp b.cpp
/* a.cpp */
inline void A() {
}
/* b.cpp */
void A();
int main() {
A();
}
bash-2.05b$ g++ a.cpp b.cpp
/tmp/cckOGwEL.o(.text+0x11): In function `main':
: undefined reference to `A()'
collect2: ld returned 1 exit status
bash-2.05b$
C'est aussi le cas sur Visual C++ 5 et 6 sur lesquels j'ai travaillé.
Dans ce cas comme dans le cas des templates je prend donc l'habitude de
créer des fichiers ayant une extension autre (.Tpp et .inl) et je les
inclus dans les .cpp.
À noter que je n'ai jamais testé comeau mais tous ces codes doivent passer
sous Comeau bien sûr.
Anthony
--
"You could be my unintended, choice to live my life extended
You should be the one I'll always love, I'll be there as soon as I can
But I'm busy mending broken pieces of the life I had before"
(C) Muse - Unintended
Une fonction inline voit sa portée limitée au fichier en cours, donc il faut qu'elle soit définie dans le .h
Pas vraiment il me semble, en tout cas pas pour les fonctions libres où le inline laisse le « external linkage »...
Mais comme ça ne fonctionne pas pour Michaël, soit ce n'est pas le cas pour les fonctions membres, soit son compilateur n'est pas à jour. Je n'ai pas le temps de vérifier ce cas dans la norme, mais à tout le moins, ceci devrait fonctionner :
Dans la norme ok, mais dans la pratique je n'ai vu que des compilateurs qui avaient un comportement qui faisait que inline entrainait static, c'est à dire réduction de la portée de la fonction.
bash-2.05b$ g++ --version g++ (GCC) 3.2.3 Copyright (C) 2002 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
bash-2.05b$ cat a.cpp b.cpp /* a.cpp */
inline void A() { }
/* b.cpp */
void A();
int main() { A(); } bash-2.05b$ g++ a.cpp b.cpp /tmp/cckOGwEL.o(.text+0x11): In function `main': : undefined reference to `A()' collect2: ld returned 1 exit status bash-2.05b$
C'est aussi le cas sur Visual C++ 5 et 6 sur lesquels j'ai travaillé. Dans ce cas comme dans le cas des templates je prend donc l'habitude de créer des fichiers ayant une extension autre (.Tpp et .inl) et je les inclus dans les .cpp.
À noter que je n'ai jamais testé comeau mais tous ces codes doivent passer sous Comeau bien sûr.
Anthony -- "You could be my unintended, choice to live my life extended You should be the one I'll always love, I'll be there as soon as I can But I'm busy mending broken pieces of the life I had before" (C) Muse - Unintended