OVH Cloud OVH Cloud

liaison d'une fonction définie dans un namespace anonyme

5 réponses
Avatar
Benoît Dejean
je tombe un peu de haut. Voici 3 définitions de fonctions :


int one() { return 1; }

static int two() { return 2; }

namespace
{
int three() { return 3; }
}

int main()
{
return one() + two() + three();
}

je m'attendais à ce que mon compilateur traite two() et three() de la
même manière, c'est-à-dire que qu'il génère des définition à liaison
interne.

Mais il n'en ai rien, three() a une liaison externe, tout comme one(). À
lire TCPPPL, il apparait clairement qu'un namespace anonyme est un
namespace qui possède un nom unique. Maintenant je ne vois rien qui
empêche une optimisation. En effet, le programme de test précédent
retourn 6. Les définitions de two() et three() m'apparaissent comme
inutiles : mon compilateur le détecte et ne génère pas de définition
pour two().

Merci.

5 réponses

Avatar
Jean-Marc Bourguet
Benoît Dejean writes:

je tombe un peu de haut. Voici 3 définitions de fonctions :


int one() { return 1; }

static int two() { return 2; }

namespace
{
int three() { return 3; }
}

int main()
{
return one() + two() + three();
}

je m'attendais à ce que mon compilateur traite two() et three() de la
même manière, c'est-à-dire que qu'il génère des définition à liaison
interne.

Mais il n'en ai rien, three() a une liaison externe, tout comme
one().


C'est ce que demande la norme.

Le probleme est qu'il y a deux notions de liaison interne et externe:
celle du C++ et celle du systeme. Le compilateur a fait le choix de
faire correspondre les deux, ce n'est pas toujours la meilleure
solution.

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
Benoît Dejean
Le Tue, 19 Oct 2004 09:22:47 +0200, Jean-Marc Bourguet a écrit :


C'est ce que demande la norme.


donc je vais la suivre

Le probleme est qu'il y a deux notions de liaison interne et externe:
celle du C++ et celle du systeme. Le compilateur a fait le choix de
faire correspondre les deux, ce n'est pas toujours la meilleure
solution.


je vois ça. J'ai déassembler certaines de mes bibliothèques : g++ m'a
inliner de tas de choses. Résultat, j'ai des tas de définitions de
fonctions jamais appelées :/

Donc static et namespace{} ne sont pas équivalents.

Avatar
Jean-Marc Bourguet
Benoît Dejean writes:

Le Tue, 19 Oct 2004 09:22:47 +0200, Jean-Marc Bourguet a écrit :


C'est ce que demande la norme.


donc je vais la suivre

Le probleme est qu'il y a deux notions de liaison interne et externe:
celle du C++ et celle du systeme. Le compilateur a fait le choix de
faire correspondre les deux, ce n'est pas toujours la meilleure
solution.


je vois ça. J'ai déassembler certaines de mes bibliothèques : g++ m'a
inliner de tas de choses. Résultat, j'ai des tas de définitions de
fonctions jamais appelées :/


Il me semble que les developpeurs de gcc connaissent ce probleme car
ici il n'y a pas besoin d'avoir les definitions et gcc a normalement
toutes les infos necessaires. (Gaby va vraissemblablement infirmer si
c'est necessaire).

Donc static et namespace{} ne sont pas équivalents.


Ca c'est connu. Par exemple avec les templates, un nom dependant
static ne sera pas trouve mais dans un namespace {} bien.

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
Benoît Dejean
Le Tue, 19 Oct 2004 10:47:43 +0200, Jean-Marc Bourguet a écrit :

Benoît Dejean writes:

je vois ça. J'ai déassembler certaines de mes bibliothèques : g++ m'a
inliner de tas de choses. Résultat, j'ai des tas de définitions de
fonctions jamais appelées :/


Il me semble que les developpeurs de gcc connaissent ce probleme car
ici il n'y a pas besoin d'avoir les definitions et gcc a normalement
toutes les infos necessaires. (Gaby va vraissemblablement infirmer si
c'est necessaire).


ça me fait plaisir que tu mettes le mot problème :)


Donc static et namespace{} ne sont pas équivalents.


Ca c'est connu. Par exemple avec les templates, un nom dependant
static ne sera pas trouve mais dans un namespace {} bien.


tiens je ne savais pas ça. Mais étant jeune, j'ai toujours utilisé les
namespace anonymes, je n'ai jamais était confronté au problème.


Avatar
Jean-Marc Bourguet
Benoît Dejean writes:

Donc static et namespace{} ne sont pas équivalents.


Ca c'est connu. Par exemple avec les templates, un nom dependant
static ne sera pas trouve mais dans un namespace {} bien.


tiens je ne savais pas ça. Mais étant jeune, j'ai toujours utilisé
les namespace anonymes, je n'ai jamais était confronté au problème.


Si le compilateur n'implemente pas la recherche des noms en deux
phases, il y a des risques que le probleme passe inappercu.

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