C++ C++;不使用“时重新定义链接错误”;内联“;或;“静态”;具有无类函数的关键字
因此,我意识到,当包含一个“.h”文件时,编译器基本上会将该文件的内容复制到包含它的位置。所以很明显,如果我在很多文件中都包含了“Utils.h”,那么如果Utils.h包含函数实现,就会导致重新定义错误 我还意识到,使用C++ C++;不使用“时重新定义链接错误”;内联“;或;“静态”;具有无类函数的关键字,c++,static,linker-errors,inline-functions,C++,Static,Linker Errors,Inline Functions,因此,我意识到,当包含一个“.h”文件时,编译器基本上会将该文件的内容复制到包含它的位置。所以很明显,如果我在很多文件中都包含了“Utils.h”,那么如果Utils.h包含函数实现,就会导致重新定义错误 我还意识到,使用inline关键字可以从本质上消除函数并在其使用站点将其对齐,从而解决此问题 现在我的问题是,当头文件中使用static关键字时,它似乎也解决了问题,但我不确定我是否完全理解为什么/如何解决问题。。。?我的理解是,cpp文件中的static实际上只能在编译单元中使用 为了确保我
inline
关键字可以从本质上消除函数并在其使用站点将其对齐,从而解决此问题
现在我的问题是,当头文件中使用static
关键字时,它似乎也解决了问题,但我不确定我是否完全理解为什么/如何解决问题。。。?我的理解是,cpp文件中的static实际上只能在编译单元中使用
为了确保我们都在同一页上,这里有一段有问题的代码片段:
//Utils.h (included in many places)
namespace utils {
void someUtil() {
//do work
}
}
如果上面的代码会抛出错误,但是使用static
和/或inline
关键字,则不会出现问题
所以我想知道在这种情况下,static在做什么,如果它是一个小函数体,我应该使用它吗?或者…?static告诉编译器在定义它的每个翻译单元中生成函数,而不是共享它。因此,如果在多个翻译单元中使用,并且如果在不同的TU中检查函数的地址,则结果将不同,那么最终在生成的可执行文件中存在任意数量的技术上独立的函数 另一方面,功能: 内联函数或函数的定义可能不止一个 变量(从C++17开始)在程序中只要每个定义 以不同的转换单位显示(对于非静态内联) 函数和变量(自C++17以来)所有定义都是相同的。 例如,内联函数或内联变量(从C++17开始) 可以在包含在多个源中的头文件中定义 档案 因此,编译器将要么内联调用函数,要么将来自不同TU的函数定义合并在一起(以便生成的函数在可执行文件中存在一次)
因此,在您的情况下,内联就是您所需要的。“我还认识到,使用内联关键字可以从本质上消除函数,并在其使用站点上对其进行内联处理,从而解决此问题。”-不。这实际上不是
内联的功能。查看是否在多个cpp文件中包含头文件,并使用static
,然后每个编译单元(通常称为翻译单元)将获得它自己的函数副本。但是,由于每个副本都是静态的,因此它具有内部链接,因此链接器不会看到多个定义错误。简单回答,只需使用内联
,它是专为描述的情况而设计的。