防止头文件中类实现出现"already defined"错误
Preventing "already defined" error for class implementation in header file
我想在头文件中包含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
}
[Edit]使用include guard无助于阻止编译将实现包含在所有对象文件中,从而阻止链接器遇到"多重定义"错误。
您必须使用include guard,它们本质上只是宏,用于确定编译器是否已经包含接口或头文件中的任何内容。
例如
#ifndef FOO_WRAPPER_H
#define FOO_WRAPPER_H
// header contents here ...
#endif // !FOO_WRAPPER_H
如果使用的是Microsoft编译器,则可以使用头文件顶部的指令#pragma once
。请注意,这会破坏与其他编译器的兼容性。
当您正确内联代码时,您可以轻松解决多重定义问题:
class FooWrapper : public IFoo {
virtual void foo() override {
//some magic here
}
};
相关文章:
- 如果两个静态库使用相同的另一个静态库,如何避免"LNK2005 Already Defined error"?
- 使用 gtest 时"_main already defined"
- "... already defined in *.obj"但我没有在同一范围内两次定义任何变量
- 是什么导致了代码中出现"error LNK2005: already defined in .obj"错误?
- 在VS 2015中使用Microchip的mpusbapi.h会产生"LNK2005 Already defined"错误
- "Destructor already defined"专用析构函数
- 由 Boost 单元测试框架 dll 导出的 std::basic_ostringstream 会导致"already defined symbol"错误
- 为什么"already defined"?
- 导致链接器错误的单一实例:"already defined"
- 避免 c++ none 类变量中的"already defined in ..."错误/交战
- 全局指针"already defined in"错误
- 编译错误"already defined"
- 如何在此处收到"already defined"链接器错误?
- 错误 LNK2005:"already defined in SkinHeaderCtrl.obj"
- C++ 可变参数模板"multiple definitions"/"already defined"问题
- 无法通过"DllMain already defined"错误
- LNK2005 (already defined)
- miniz.c 在 VS 中出现"already defined"错误
- C++03 链接器"already defined symbol"未显示在中间文件中
- LNK2005 .obj 中的函数指针数组"already defined"