防止头文件中类实现出现"already defined"错误

Preventing "already defined" error for class implementation in header file

本文关键字:already defined 错误 实现 文件      更新时间:2023-10-16

我想在头文件中包含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
    }
};