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