簡體   English   中英

Xcode 4.1:Apple LLVM 2.1與LLVM GCC 4.2和GCC 4.2的行為不同

[英]Xcode 4.1: Apple LLVM 2.1 behaves different from LLVM GCC 4.2 and GCC 4.2

符合C ++ 03標准7.3.3 / 4。 由於函數g具有C鏈接,因此下面的代碼是格式良好的。 A :: g()和B :: g()應該引用同一個實體。

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
}

- 尾注]

考慮到引用,它似乎很可能是一個Clang bug。

最有可能的是,Clang認為這兩個實體是不同的,因為它們是在不同的范圍( namespace Anamespace B )中聲明的,並沒有意識到extern "C"顛覆了范圍規則。

我建議不要在命名空間中放置extern "C"聲明,因為命名空間與那些無關,因此,即使適用,它也只會混淆開發人員(有時候編譯器:p)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM