liaison d'une fonction définie dans un namespace anonyme
5 réponses
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().
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
Benoît Dejean <bnet@ifrance.com> 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
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
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.
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.
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.
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
Benoît Dejean <bnet@ifrance.com> 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
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
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.
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.
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.
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
Benoît Dejean <bnet@ifrance.com> 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
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