2011-10-07 4 views
3

Par C++ 03 standard 7.3.3/4. Le code ci-dessous est bien formé puisque la fonction g a une liaison C. A :: g() et B :: g() devraient faire référence à la même entité. Lorsque je compile le code C++ avec Xcode 4.1, il existe différents comportements lors de la sélection de différents compilateurs. Si Apple LLVM 2.1 est sélectionné, il y a une erreur de compilation, dites "Call to 'g' est ambigu". Si vous sélectionnez GCC 4.2 ou LLVM GCC 4.2, il peut être compilé avec succès.Xcode 4.1: Apple LLVM 2.1 se comporte différemment de LLVM GCC 4.2 et GCC 4.2

Est-ce un défaut de CLang ou je me trompe quelque part?

Le Apple LLVM 2.1 est en fait que Clang est le frontal et LLVM est le back-end, non?

============================================== ============================

La description correspondante de la norme C est:

Si la recherche de nom trouve une déclaration pour un nom dans deux espaces de noms différents, et les déclarations ne déclarent pas la même entité et ne déclarent pas de fonctions, l'utilisation du nom est mal formée. [Note: en particulier, le nom d'un objet, d'une fonction ou d'un énumérateur ne cache pas le nom d'une classe ou d'une énumération déclarée dans un espace de noms différent. Par exemple,

namespace A { 
    class X { }; 
    extern "C" int g(); 
    extern "C++" int h(); 
} 
namespace B { 
    void X(int); 
    extern "C" int g(); 
    extern "C++" int h(); 
} 

using namespace A; 
using namespace B; 

void f() { 
    X(1); // error: name X found in two namespaces 

    g(); // okay: name g refers to the same entity 

    h(); // error: name h found in two namespaces 
} 

-end ndlr]

Répondre

2

Il semble probable, compte tenu de la citation, qu'il est un bug Clang.

Très probablement, Clang considère les deux entités distinctes parce qu'ils ont été déclarés dans les différents champs d'application (namespace A et namespace B), et ne se rend pas compte que extern "C" subvertit les règles de portée.

Je conseille contre puting extern "C" déclarations dans les espaces de noms, puisque namespaces ne sont pas pertinents pour ceux, et donc, même le cas échéant, il ne confondez pas les développeurs (et les compilateurs de temps en temps: p)

Questions connexes