c++ - 解决 GNU 中重新声明的链接器错误

标签 c++ linux gnu

我有以下实现:

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/

相关文章:

linux - 在后台运行您自己的 python 脚本

c - 学习如何使用 GNU Autotools 打包我的程序时遇到问题

ios - Xcode 警告 : . .. 是 GNU 扩展

c++ - 如何为内联变量模板创建自定义点?

c++ - 跨依赖类的状态一致性

c++ - std::tie 和 std::forward_as_tuple 有什么区别

linux - 具有特定端口的 Jenkins 奴隶

android - 移植:Android/Linux 客户端/服务器套接字通信问题

shell - 使用 gnu 并行处理带标题的 CSV 文件

c# - 为什么表达式末尾的重复分号和更多分号不会导致 Visual Studio 编译器出错?