防止"已定义"头文件中的类实现错误

时间:2014-04-24 09:37:47

标签: 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 guard不会阻止编译在所有目标文件中包含实现,因此链接器会遇到“多重定义”错误。

2 个答案:

答案 0 :(得分:2)

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

例如

#ifndef FOO_WRAPPER_H
#define FOO_WRAPPER_H

// header contents here ...

#endif // !FOO_WRAPPER_H

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

答案 1 :(得分:1)

当您正确内联代码时,可以轻松解决多重定义问题:

class FooWrapper : public IFoo {
    virtual void foo() override {
      //some magic here
    }
};