为什么在其他地方包含的另一个 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.h
或 foobar.h
包含在多个文件中。
最好的解决方案是将文件中的所有 functions/methods 声明为 inline
。您也可以声明它们 static
(或者,在 C++ 的情况下,将它们放入匿名命名空间)但效率较低,因为代码将被复制。
我有一个 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.h
或 foobar.h
包含在多个文件中。
最好的解决方案是将文件中的所有 functions/methods 声明为 inline
。您也可以声明它们 static
(或者,在 C++ 的情况下,将它们放入匿名命名空间)但效率较低,因为代码将被复制。