gpt4 book ai didi

不将 "inline"或 "static"关键字与无类函数一起使用时出现 C++ 重新定义链接错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:02:22 27 4
gpt4 key购买 nike

所以我意识到,当包含一个“.h”文件时,编译器实质上是将该文件的内容复制到它被包含的位置。所以很明显,如果我在许多文件中包含“Utils.h”,如果 utils.h 包含函数实现,则会导致重定义错误。

我还意识到使用 inline 关键字可以解决这个问题,方法是从根本上消除函数并将其内联到使用位置。

现在我的问题是,当在头文件中使用 static 关键字时,它似乎也解决了问题,但我不确定我是否完全理解为什么/如何解决问题……?据我了解,cpp 文件中的 static 本质上会使它仅在该编译单元中可用。

为了确保我们都在同一页面上,这里有一段有问题的代码:

//Utils.h (included in many places)
namespace utils {

void someUtil() {
//do work
}

}

上面会抛出错误的地方,但是使用 static 和/或 inline 关键字,就不会有问题。

所以我想知道 static 在这种情况下做了什么,如果它是一个小函数体或...,我应该使用它还是内联?

最佳答案

static,告诉编译器在定义它的每个翻译单元中生成函数,只是不共享它。因此,如果您在许多翻译单元中使用,并且如果您在不同的 TU 中检查函数的地址,您将得到不同的结果,那么最终可执行文件中存在任意数量的技术上独立的函数。

inline另一方面的功能:

There may be more than one definition of an inline function or variable (since C++17) in the program as long as each definition appears in a different translation unit and (for non-static inline functions and variables (since C++17)) all definitions are identical. For example, an inline function or an inline variable (since C++17) may be defined in a header file that is #include'd in multiple source files.

因此,编译器将内联调用函数,或者将来自不同 TU 的函数定义合并在一起(以便生成的函数在可执行文件中存在一次)。

所以在您的情况下,内联就是您所需要的。

关于不将 "inline"或 "static"关键字与无类函数一起使用时出现 C++ 重新定义链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57231217/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com