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 

fonction 'static'
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
Michaël Delva
Guest





PostPosted: Thu May 20, 2004 2:25 pm    Post subject: fonction 'static' Reply with quote



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?

Merci d'avance...
Back to top
Michel Michaud
Guest





PostPosted: Thu May 20, 2004 3:09 pm    Post subject: Re: fonction 'static' Reply with quote



Dans news:Xns94EFA700C7D22zoubidamanhotmailcom (AT) 212 (DOT) 27.42.65,
Michaël Delva <zoubidaman (AT) hotmail (DOT) com> a écrit :
Quote:
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?

Non. Tu as essayé ?

--
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
Horst Kraemer
Guest





PostPosted: Thu May 20, 2004 3:24 pm    Post subject: Re: fonction 'static' Reply with quote



On 20 May 2004 14:25:30 GMT, "Michaël Delva" <zoubidaman (AT) hotmail (DOT) com>
wrote:

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

Non. Tu les fais comme d'habitude

//toto.h
#ifndef TOTO_H
#define TOTO_H
struct X
{
static void f();
};
#endif


//toto.cpp
#include "toto.h"
void X::f() {}

//main.cpp
#include "toto.h"
int main()
{
X::f();
}

--
Horst


Back to top
Anthony Fleury
Guest





PostPosted: Thu May 20, 2004 3:30 pm    Post subject: Re: fonction 'static' Reply with quote

Michaël Delva wrote:

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

Back to top
Michaël Delva
Guest





PostPosted: Thu May 20, 2004 5:32 pm    Post subject: Re: fonction 'static' Reply with quote

J'ai testé ;-)

Voici mon fichier H

#ifndef Base64H
#define Base64H

#include <vector>
#include <string>

class Base64
{
static char Encode(unsigned char uc);
static unsigned char Decode(char c);
static bool IsBase64(char c);
public:
static std::string Encode(const std::vector<unsigned char> & vby);
static std::vector<unsigned char> Decode(const std::string & str);
};

#endif

Les implémentations des fonctions sont dans le CPP (Example d'une fonction)

inline char Base64::Encode(unsigned char uc)
{
if (uc < 26)
return 'A'+ uc;

if (uc < 52)
return 'a'+ (uc - 26);

if (uc < 62)
return '0'+ (uc - 52);

if (uc == 62)
return '+';

return '/';
};



Quand dans une autre classe je fais:

//....
#include "Base64.h"
//....

void MaFonction()
{
std::string result = Base64::Encode(vect);
}

J'ai le message suivant à la liaison (Avec Borland):

[Lieur Erreur] Unresolved external 'Base64::Encode(const _STL::vector
&)' referenced from D:
BORLANDCBUILDER6PROJECTSUNIT1.OBJ

Par contre si je mets les implémentations dans le H, tout fonctionne
correctement...

D'où vient le problème?
Back to top
Anthony Fleury
Guest





PostPosted: Thu May 20, 2004 5:44 pm    Post subject: Re: fonction 'static' Reply with quote

Michaël Delva wrote:

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

Quote:

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

Back to top
Michel Michaud
Guest





PostPosted: Thu May 20, 2004 5:47 pm    Post subject: Re: fonction 'static' Reply with quote

Dans news:Xns94EFC6B5C1BA8zoubidamanhotmailcom (AT) 212 (DOT) 27.42.70,
Michaël Delva <zoubidaman (AT) hotmail (DOT) com> a écrit :
Quote:
J'ai testé ;-)

class Base64
{
static char Encode(unsigned char uc);
static unsigned char Decode(char c);

[...]
Quote:
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 [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
Michaël Delva
Guest





PostPosted: Thu May 20, 2004 5:57 pm    Post subject: Re: fonction 'static' Reply with quote

Quote:
D'où vient le problème?

du inline.

Anthony

Effectivement... ;-)

Merci beaucoup

Back to top
Michel Michaud
Guest





PostPosted: Thu May 20, 2004 6:23 pm    Post subject: Re: fonction 'static' Reply with quote

Dans news:40acef68$0$21569$626a14ce (AT) news (DOT) free.fr, Anthony
Fleury <fleury_anthony (AT) _hotmail_ (DOT) com> a écrit :
Quote:
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 [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
Fabien LE LEZ
Guest





PostPosted: Thu May 20, 2004 6:36 pm    Post subject: Re: fonction 'static' Reply with quote

On Thu, 20 May 2004 17:30:14 +0200, Anthony Fleury
<fleury_anthony (AT) _hotmail_ (DOT) com> wrote:

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

--
Wink
FLL, Epagneul Breton

Back to top
Anthony Fleury
Guest





PostPosted: Thu May 20, 2004 6:46 pm    Post subject: Re: fonction 'static' Reply with quote

Michel Michaud wrote:

Quote:
Dans news:40acef68$0$21569$626a14ce (AT) news (DOT) free.fr, Anthony
Fleury <fleury_anthony (AT) _hotmail_ (DOT) com> a écrit :

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

Back to top
Anthony Fleury
Guest





PostPosted: Thu May 20, 2004 6:47 pm    Post subject: Re: fonction 'static' Reply with quote

Fabien LE LEZ wrote:

Quote:
On Thu, 20 May 2004 17:30:14 +0200, Anthony Fleury
[email]fleury_anthony (AT) _hotmail_ (DOT) com[/email]> 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.


En effet, enfin comme je parle souvent à tort d'après mon experience, je
n'ai jamais vu de compilateur qui avait un comportement autre... Mais je
ferai attention à bien préciser ma pensée à l'avenir :-)

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

Back to top
Michel Michaud
Guest





PostPosted: Thu May 20, 2004 7:14 pm    Post subject: Re: fonction 'static' Reply with quote

Dans news:40acfde8$0$20507$626a14ce (AT) news (DOT) free.fr, Anthony
Fleury <fleury_anthony (AT) _hotmail_ (DOT) com> a écrit :
Quote:
Michel Michaud wrote:

Dans news:40acef68$0$21569$626a14ce (AT) news (DOT) free.fr, Anthony
Fleury <fleury_anthony (AT) _hotmail_ (DOT) com> a écrit :

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

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

Ça fonctionne comme j'ai décrit avec VC 7.1...

C'est surprenant que ça ne fonctionne pas avec g++ (est-ce
la dernière version que tu as essayée ?).

Par ailleurs, je ne sais toujours pas si c'est pareil avec
les fonctions membres et static (je suppose que ce n'est
pas le cas avec les fonctions libres statiques alors il
faudrait vraiment lire la norme... bientôt !).

--
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
Anthony Fleury
Guest





PostPosted: Thu May 20, 2004 7:14 pm    Post subject: Re: fonction 'static' Reply with quote

Anthony Fleury wrote:

[...]

Quote:
À noter que je n'ai jamais testé comeau mais tous ces codes doivent passer
sous Comeau bien sûr.


hum je suis endormi !! je confonds avec les templates qui devraient passer
avec export. TC++PL page 161 :
"la définition d'une fonction inline doit être réalisée dans la portée."

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

Back to top
Jean-Marc Bourguet
Guest





PostPosted: Thu May 20, 2004 7:15 pm    Post subject: Re: fonction 'static' Reply with quote

"Michel Michaud" <mm (AT) gdzid (DOT) com> writes:

Quote:
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();
}

Non. Il faut avoir une définition dans toute unité où la
fonction est utilisée (3.2/3).

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