所以我意识到,当包含".h"文件时,编译器基本上将该文件的内容复制到包含它的位置。所以很明显,如果我在许多文件中包含"Utils.h",如果utils.h持有函数实现,它会导致重定义错误。
我还意识到使用inline
关键字通过基本上消除该功能并将其内联到其使用站点来解决此问题。
现在我的问题是,当在头文件中使用static
关键字时,它似乎也可以解决问题,但我不确定我是否完全理解它为什么/如何解决问题......?我的理解是,cpp 文件中的静态基本上使其仅在该编译单元中可用。
为了确保我们都在同一页面上,这里有一个有问题的代码片段:
//Utils.h (included in many places)
namespace utils {
void someUtil() {
//do work
}
}
上面会抛出错误,但使用static
和/或inline
关键字,就不会有问题。
所以我想知道在这种情况下静态在做什么,如果它是一个小函数体或......,我应该使用它以及内联吗?
静态的,告诉编译器在定义函数的每个翻译单元中生成函数,并且不共享它。因此,如果您在许多翻译单元中使用,并且如果您在不同的 TU 中检查函数的地址,您最终会在生成的可执行文件中存在任意数量的技术上独立的函数,您将获得不同的结果。
另一方面,内联函数:
内联函数可能有多个定义,或者 变量(自C++17起)在程序中只要每个定义 出现在不同的翻译单元中,并且(对于非静态内联 函数和变量(自C++17起)所有定义都是相同的。 例如,内联函数或内联变量(自 C++17 起) 可以在多个源中 #include 的头文件中定义 文件。
因此,编译器将要么对函数进行内联调用,要么将来自不同 TU 的函数定义合并在一起(以便生成的函数在可执行文件中存在一次)。
因此,在您的情况下,内联就是您所需要的。