Xcode 4.1:Apple LLVM 2.1的行为不同于LLVM GCC 4.2和GCC 4.2
问题描述:
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
}
就要收注]
答
这很可能,给出的报价,这是一个锵错误。
最可能的是,锵认为这两个实体不同,因为它们是在不同的范围(namespace A
和namespace B
)申报,并没有意识到,extern "C"
颠覆的范围规则。
我会建议对命名空间内puting extern "C"
声明,因为名称空间是无关的,因此,即使适用,它只会混淆开发商(和偶尔编译器:P)