gpt4 book ai didi

c++ - 为什么我会收到 'multiple definition' 错误?我如何解决它?

转载 作者:太空狗 更新时间:2023-10-29 21:14:09 25 4
gpt4 key购买 nike

终端给出的命令:

g++ main.cpp test.cpp

错误信息:

/tmp/ccvgRjlI.o: In function `test2()':
test.cpp:(.text+0x0): multiple definition of `test2()'
/tmp/ccGvwiUE.o:main.cpp:(.text+0x0): first defined here
collect2: error: ld returned 1 exit status main.cpp

源代码:

#include "test.hpp"
int main(int argc, char *argv[])
{
test2();
return 0;
}

测试.hpp

#ifndef _TEST_HPP_
#define _TEST_HPP_

#include <iostream>

void test();
void test2() { std::cerr << "test2" << std::endl; }

#endif

测试.cpp

#include "test.hpp"

using std::cerr;
using std::endl;

void test() { cerr << "test" << endl; }

顺便说一句,下面的编译很好:

g++ main.cpp

最佳答案

header test.hpp 包含在两个编译单元中。第一个是编译单元main.cpp,第二个是编译单元test.cpp

默认情况下,函数具有外部链接。这意味着具有相同名称和签名的函数在不同的编译单元中表示相同的函数。它们应被定义一次。然而,在您的程序中,函数 test2 的定义存在于两个编译单元中,链接器不知道要使用的函数定义。

您可以将函数声明为内联函数。例如

inline void test2() { std::cerr << "test2" << std::endl; }

在这种情况下,它可以在每个编译单元中定义。

或者您可以只将函数声明放在 header 中,就像您对函数 test 所做的那样,并在 test.cpp 中定义它。

另一种方法是将函数声明为具有内部链接。为此,您可以使用关键字 static

在 header 中定义函数
static void test2() { std::cerr << "test2" << std::endl; }

或者放在无名命名空间

namespace
{
void test2() { std::cerr << "test2" << std::endl; }
}

在这种情况下,每个编译单元都有自己的函数test2

关于c++ - 为什么我会收到 'multiple definition' 错误?我如何解决它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41597744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com