解决 GNU 中用于重新声明的链接器错误

Resolve linker errors in GNU for redeclaration

本文关键字:声明 链接 错误 GNU 用于 新声明 解决      更新时间:2023-10-16

>我有以下实现:

A 的标头:

class A
{
public:
foo();
};

A 有自己的 .cpp 文件,其中包含 foo() 的实现

B 的标头

#include "A.h"
class B
{
public foo();
};

注意:B 没有自己的标头

现在在 C 类.cpp中,我想重用 A 的标头和 B.o 的实现。所以在 C.cpp 中,我做到了:

//C.cpp
#include "A.h"
....
B b;
b.foo();
..

当我编译上述内容时,我一定会得到函数 foo() 的重新声明错误。我想知道是否有任何方法可以告诉 GNU 编译器采用 B.o 并省略 A.o...还是告诉编译器考虑 make 文件中包含实现的第一个对象并忽略其余对象?

我正在使用 GNU v2.16

您的问题是关于重新声明A,因为在C.cpp中,它会看到 2 个声明A一个通过 A.h 另一个通过 B.h ,所以只需在标头保护中保护A.h以避免多次包含它,通常您应该始终保护您的标头:

#ifndef HEADER_A_h_INCLUDED
#define HEADER_A_h_INCLUDED
class A {...};
#endif

现在,如果您多次包含A.h,此守卫将使第二次包含为无!