简单程序中的链接器错误:函数的多重定义

Bil*_*ean 1 c++ linker linker-errors

我的函数test被添加到两个不同的.cpp文件中,并且这些函数对于各自的文件是私有的,如下所示

test1.cpp

#include <iostream>

using namespace std;

void test()
{
    cout << "test" << endl;
}
Run Code Online (Sandbox Code Playgroud)

test2.cpp

#include <iostream>

using namespace std;

void test()
{
    cout << "test" << endl;
}
Run Code Online (Sandbox Code Playgroud)

main.cpp

#include <iostream>

using namespace std;



int main()
{

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在链接期间我收到错误multiple definition of test()- 但考虑到这两个文件有自己的私有范围,这怎么可能!?如果我在每个文件的相应标头中包含函数原型我可以理解它.cpp,但在这个例子中没有这样的东西。

Jes*_*ood 5

您需要inline为此关键字:

inline void test()
{
    cout << "test" << endl;
}
Run Code Online (Sandbox Code Playgroud)

这允许您在单独的源文件中拥有多个定义,而不会违反单一定义规则。但是,请注意,该函数仍然具有外部链接,并且它们都将解析为相同的地址。还:

内联函数应在使用 odr 的每个翻译单元中定义,并且在每种情况下都应具有完全相同的定义

如果您想要具有不同地址(内部链接)的单独函数,请改用关键字static