c++ - 防止头文件中类实现的 "already defined"错误

标签 c++

我想在头文件中包含 C++ 类的定义和实现。

我正在创建一个需要与 C 语言兼容的库。 .h 文件定义了一个 C++ 类,可以对其进行子类化,以便以 C++ 方式轻松访问该库。它也在图书馆内部使用。

由于头文件被导入到多个子类中,我总是得到“多重定义”的错误。因为类定义对于库的用户来说应该是可导入的,所以我不想将实现移动到单独的 cpp 文件中。

你知道如何解决这个问题吗?

简化示例:

//library:
typedef struct IFoo{
 virtual void foo = 0;
};

void library_fun_a(IFoo*);
void library_fun_b(IFoo*);

//header file
#pragma once
class FooWrapper : public IFoo{
  virtual void foo() override;
};
void FooWrapper::foo(){
  //some magic here
}

[编辑] 使用包含保护无助于阻止编译将实现包含在所有目标文件中,因此链接器遇到“多重定义”错误。

最佳答案

您必须使用 include guards 本质上只是宏,用于确定编译器是否已经包含接口(interface)或头文件中的任何内容。

例如

#ifndef FOO_WRAPPER_H
#define FOO_WRAPPER_H

// header contents here ...

#endif // !FOO_WRAPPER_H

如果您使用的是 Microsoft 编译器,则可以在头文件顶部使用指令 #pragma once。请注意,这会破坏与其他编译器的兼容性。

关于c++ - 防止头文件中类实现的 "already defined"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23265169/

相关文章:

c++ - 24 位图像中有多少种颜色组合

c++ - 对于循环灾难,迭代次数超过应有的次数

c++ - 用于查找多数元素的分而治之算法?

c++ - 适用于存储和计算最高得分 K 项的数据结构

c++ - 分析模板元程序编译时间

c++ - 什么是代表?

c++ - 这是分配非常量数组的合法举动吗?

c++ - 一组互斥任务的线程级并行性

c++ - 是否可以使用 static_cast 从可变枚举创建 boost::mpl::list_c?

c++ - 动态字符串数组分配错误