如果我有一个文件foo.cpp
用下面的代码:为什么跨cpp文件定义一个类不会导致链接器错误?
class Foo {
};
class Foo {
};
int main() {
return 0;
}
那么自然,我得到error: redefinition of 'Foo'
。但是,如果我有foo.cpp
与
class Foo {
};
int main() {
return 0;
}
而且bar.cpp
与
class Foo {
};
尽管class Foo
整个程序被定义了两次,这件事编译罚款。
如果我已经把int something;
在这两个文件中的全局命名空间,然后我就已经得到了链接错误(具体duplicate symbol
),但对于类定义,这永远不会发生。
我知道函数声明如int doIt();
可以在两个cpp文件被复制,但定义,例如int doIt() {}
不能是。现在在第一个编译器出错(与class Foo{};
两次在一个cpp文件中),它说redefinition of foo
,所以class Foo{};
是一个定义。那么为什么与函数不同,它可以在一个程序中定义两次?
编辑:根据this website,命名的类有外部链接。那么为什么在这两个cpp文件之间没有冲突class Foo
?
编辑2:根据上面链接的网站,不仅命名类有外部链接,但它也是静态成员。然而,这一切编译罚款:
foo.cpp
:
class Foo {
public:
int foo();
static int x;
};
int Foo::foo() {
return 5;
}
int main() {
return 0;
}
bar.cpp
:
class Foo {
public:
int foo(int);
static bool x;
};
int Foo::foo(int i) {
return i * 2;
}
不但Foo::foo
被重新定义有不同的签名,但Foo::x
是不同类型的。这两个应该有外部链接,但这个代码是A-好的。
那是什么编译器? –
此问题[已在此处讨论](http://stackoverflow.com/questions/6465325/do-classes-have-external-linkage),tl; dr;当具有相同名称的类(枚举,联合等)分别在不同的翻译单元中定义时,它们具有内部链接或没有链接,因此不会发生错误。请注意,接受的答案是错误的,并且有更多upvotes的答案是正确的。 – VTT
@ΦXocę웃ПетаоApple LLVM V7.3.0(clang-703.0.31) – rcplusplus