好的,我有 3 个文件、一个标头、一个标头的来源和一个主文件。在头文件中,我定义了一个带有函数的类。在源文件中,我定义了函数。但是,在主文件中,我重新定义了函数,然后在主函数中创建类的实例并调用该函数。这编译得很好 - 没有任何警告。至少可以说输出是可怕的。
头文件:testme.h
#ifndef testme_h_
#include <iostream>
using namespace std;
class wtf {
public:
string getStr();
};
#endif
来源:testme.cpp
#include "testme.h"
string wtf::getStr() {
return "Hello World!";
};
主要:main.cpp
#include <iostream>
using namespace std;
#include "testme.h"
string wtf::getStr()
{
return "God is Dead.";
}
int main()
{
wtf f;
cout << f.getStr() << endl;
}
输出:
God is Dead.
为什么这行得通?为什么没有关于多个定义的错误?为什么源文件的定义会被忽略?为什么没有警告?
部分答案 当它被重新编译为“g++ main.cpp testme.cpp -o sanity.o”时,实际上会产生链接器错误。
然而,让我明白的是,我写的这个小案例反映了我在一个更大的程序中遇到的一个问题,该程序在库中定义了一个函数,但是我们以几乎相同的方式在另一个“测试套件”程序中重新定义了一个函数。为什么会这样?它在库中允许它覆盖 ODR 怎么样?