2011-10-07 47 views
3

Per C++ 03標準7.3.3/4。下面的代碼是格式良好的,因爲函數g具有C鏈接。 A :: g()和B :: g()應該引用同一個實體。Xcode 4.1:Apple LLVM 2.1的行爲不同於LLVM GCC 4.2和GCC 4.2

namespace A { 
    extern "C" void g(); 
} 

namespace B { 
    extern "C" void g(); 
} 

using namespace A; 
using namespace B; 

int main(){ 
    g(); // Error (Apple LLVM 2.1): Call to 'g' is ambiguous. 

    return 0; 
} 

extern "C" void g(){ } 

當我用Xcode 4.1編譯C++代碼時,在選擇不同的編譯器時有不同的行爲。如果選擇Apple LLVM 2.1,則會出現編譯錯誤,請說「呼叫'g'不明確」。如果選擇GCC 4.2或LLVM GCC 4.2,它可以成功編譯。

這是CLang的缺陷還是我在某處錯了?

Apple LLVM 2.1實際上是Clang是前端,LLVM是後端,對嗎?

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

的C++標準相應的描述是:

如果名稱查找找到的聲明對於兩個不同名稱空間中的名稱,並且聲明不聲明相同的實體並且不聲明函數,則名稱的使用是不合格的。 [注意:特別是,對象,函數或枚舉器的名稱不會隱藏在不同命名空間中聲明的類或枚舉的名稱。例如,

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 
} 

就要收注]

回答

2

這很可能,給出的報價,這是一個鏘錯誤。

最可能的是,鏘認爲這兩個實體不同,因爲它們是在不同的範圍(namespace Anamespace B)申報,並沒有意識到,extern "C"顛覆的範圍規則。

我會建議對命名空間內puting extern "C"聲明,因爲名稱空間是無關的,因此,即使適用,它只會混淆開發商(和偶爾編譯器:P)

相關問題