我有以下实现:
A 的标题:
class A
{
public:
foo();
};
A 有自己的 .cpp 文件,其中包含 foo() 的实现
//B的头部
#include "A.h"
class B
{
public foo();
};
注意:B没有自己的header
现在在 C.cpp 类中,我想重用 A 的 header 和 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
,所以只需在 header 保护中保护 A.h
以避免多次包含它,通常你应该始终保护你的 header :
#ifndef HEADER_A_h_INCLUDED
#define HEADER_A_h_INCLUDED
class A {...};
#endif
现在,如果您多次包含 A.h
,此守卫将使第二次包含为空!
关于c++ - 解决 GNU 中重新声明的链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13639823/