为什么在其他地方包含的另一个 header 文件中包含一个 header-only 文件会导致重新定义?

Why does including a header-only file in another header file included somewhere else cause redefinition?

我有一个 header-only 库,我们称它为 foo.h,它包含在 bar.h 中,它进一步包含在 foobar.h 中。链接器抛出 LNK2005 错误,指出来自 foo.h 的函数和结构已在 foobar.obj.

中定义

foo.h 文件看起来像这样:

#pragma once

#ifndef  FOO 
#define FOO

//few structs and functions declarations and definitions (these aren't static nor inline) inside a namespace
#endif
//include guards added after I got the error for the first time

bar.h 看起来像这样:

#include "foo.h"
//some other code

foobar.h 看起来像这样:

#include "bar.h"
//some other code

这个问题可能是重复的:Why aren't include guards or pragma once working?

但是,除了使这些函数内联或静态化之外,还有其他方法可以解决这个问题吗?也许根本不编辑 foo.h

很可能 bar.hfoobar.h 包含在多个文件中。

最好的解决方案是将文件中的所有 functions/methods 声明为 inline。您也可以声明它们 static(或者,在 C++ 的情况下,将它们放入匿名命名空间)但效率较低,因为代码将被复制。