OVH Cloud OVH Cloud

fonction 'static'

31 réponses
Avatar
Michaël Delva
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...

10 réponses

1 2 3 4
Avatar
Anthony Fleury
Fabien LE LEZ wrote:

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.



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


Avatar
Michel Michaud
Dans news:40acfde8$0$20507$, Anthony
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 »...



[...]
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
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/



Avatar
Anthony Fleury
Anthony Fleury wrote:

[...]

À 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

Avatar
Jean-Marc Bourguet
"Michel Michaud" writes:

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

Avatar
Michel Michaud
Dans news:, Jean-Marc
"Michel Michaud" writes:

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


C'est ce que je comprenais aussi jusqu'à récemment. Mais j'ai
pris une note disant que ce n'est pas le cas suite à une
discussion vue sur un forum (je n'ai pas noté la référence
exacte). Y aurait-il une correction à la norme (ou un DR) qui
vient changer ce qu'on peut lire à 3.2/3 ?

(ça me ferait plaisir de me tromper, car j'ai pris la note pour
dire que je devais corriger ce que mes livres indiquent !)

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


Avatar
Anthony Fleury
Michel Michaud wrote:

Dans news:40acfde8$0$20507$, Anthony

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.




Bon j'ai sorti mon exemplaire de la norme qui me sert pas souvent car j'ai
pas trop l'habitude de ce genre de documents...

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


3.2 point 3 : "An inline function shall be defined in every translation unit
in which it is used"

Pourquoi cette restriction ??


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



Ce n'est pas le dernier gcc vu que j'ai besoin de cette version qui a déjà
compilé mon noyau... Je testerai avec le dernier quand je récupererai un pc
plus puissant car changer gcc me ferai recompiler pas mal de choses et sur
un 233 c'est la misère. En tout cas je n'ai jamais eu le comportement de
VC7.1 qui me plait pas mal.

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



9.4.1 : [note : the rules described in 9.3 apply to static members
functions ]

9.3 point 2 : A member function may be defined in its class definition, in
which case it is an inline member function (7.1.2) or it may be defined
outside of its class definition if it has already been declared but not
defined in its class definition.

Il est bien stipulé aussi dans 9.4 que le mot static ne doit apparaitre que
dans la déclaration de la fonction ou de la donnée et non dans sa
définition.

Quant aux fonctions libres statiques, elles ont le comportement du C c'est à
dire qu'elle ont un "internal linkage" tout comme les fonctions 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


Avatar
Gabriel Dos Reis
"Michel Michaud" writes:

| Dans news:40acef68$0$21569$, 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 »...

Ce n'est pas ce que dit la norme.

ARM avait une règle différente (celle que tu décris), mais cela a été
explicitement changé dans la norme. Mais de toute façon, MS a décidé
de donner une autre signification à « inline » et je ne suis pas du
tout surpris qu'il en fasse n'importe quoi.

-- Gaby
Avatar
Gabriel Dos Reis
Anthony Fleury writes:

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

La norme ne dis pas qu'une fonction member statique inline avait un linkage
interne. Tout au contraire.

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

CFfront et les compilateurs pré-norme compatibles avec CFront ont ce
comportement. C'est ce qui est décrit dans l'ARM. Mais cela a été
explicitement changé il y a longtemps.

-- Gaby
Avatar
Gabriel Dos Reis
"Michel Michaud" writes:

[...]

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

oui mais non.

| C'est surprenant que ça ne fonctionne pas avec g++

Parce que g++ implémente ce qu'exige la norme sur ce point.
C'est effectivement étrange d'implémenter ce que la norme stipule,
d'ailleurs je ne comprends pas pourquoi on a une norme.

-- Gaby
Avatar
Gabriel Dos Reis
Anthony Fleury writes:

[...]

| 3.2 point 3 : "An inline function shall be defined in every translation unit
| in which it is used"
|
| Pourquoi cette restriction ??

Il faut une exigence quelque part. Oui bien tu la mets sur
l'utilisateur ou bien tu la mets sur l'implémenteur (ou parfois les
deux). Cela demande plus d'infrastructure d'inliner trans uniter de
traduction que d'avoir le corps disponible dans chaque unité de
traduction. Si tu demandes trop de travail aux implémenteurs, ils ne
feront qu'à leurs têtes et il peut arriver qu'ils fassent n'importe
quoi. Et que tu n'aies pas la fonctionnalité que tu veux.
Alors, tu demandes un peu d'effort de la part de l'utilisateur.
N'oublie pas, « inline » a été introduit en C with Classes vers 1981
avec l'exigence que ce soit utile ici et maintenant. 25 ans plus tard,
peu de progrès ont été faits :-(

|
| >
| > C'est surprenant que ça ne fonctionne pas avec g++ (est-ce
| > la dernière version que tu as essayée ?).
| >
|
| Ce n'est pas le dernier gcc vu que j'ai besoin de cette version qui a déjà
| compilé mon noyau... Je testerai avec le dernier quand je récupererai un pc

C'est pas la peine. GCC fait comme la norme demande que ça se passe.

-- Gaby
1 2 3 4