考虑这个文件,first.cpp
包含一个类定义并使用:
#include <iostream>
struct Foo
{
Foo(){ std::cout << "Foo()" << std::endl; }
~Foo(){ std::cout << "~Foo()" << std::endl; }
};
int main(){
Foo f;
return 0;
}
另一个,second.cpp
,包含一个冲突的类定义:
#include <iostream>
struct Foo
{
Foo();
~Foo();
};
Foo::~Foo(){ std::cout << "wrong ~Foo()" << std::endl; }
当定义了两个具有相同名称的函数时,链接器会抱怨重复符号,但是这些具有重复类方法的文件编译时不会出错。
我用这些命令编译:
$ g++ -c second.cpp -o second
$ g++ second first.cpp -o first
对第二次调用的参数重新排序g++
不会改变输出。
运行时first
,这是输出:
$ ./first
Foo()
wrong ~Foo()
为什么链接器允许重复的类方法?如果显然允许,为什么要wrong ~Foo()
打印?