Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;不使用“时重新定义链接错误”;内联“;或;“静态”;具有无类函数的关键字_C++_Static_Linker Errors_Inline Functions - Fatal编程技术网

C++ C++;不使用“时重新定义链接错误”;内联“;或;“静态”;具有无类函数的关键字

C++ C++;不使用“时重新定义链接错误”;内联“;或;“静态”;具有无类函数的关键字,c++,static,linker-errors,inline-functions,C++,Static,Linker Errors,Inline Functions,因此,我意识到,当包含一个“.h”文件时,编译器基本上会将该文件的内容复制到包含它的位置。所以很明显,如果我在很多文件中都包含了“Utils.h”,那么如果Utils.h包含函数实现,就会导致重新定义错误 我还意识到,使用inline关键字可以从本质上消除函数并在其使用站点将其对齐,从而解决此问题 现在我的问题是,当头文件中使用static关键字时,它似乎也解决了问题,但我不确定我是否完全理解为什么/如何解决问题。。。?我的理解是,cpp文件中的static实际上只能在编译单元中使用 为了确保我

因此,我意识到,当包含一个“.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中检查函数的地址,则结果将不同,那么最终在生成的可执行文件中存在任意数量的技术上独立的函数

另一方面,功能:

内联函数或函数的定义可能不止一个 变量(从C++17开始)在程序中只要每个定义 以不同的转换单位显示(对于非静态内联) 函数和变量(自C++17以来)所有定义都是相同的。 例如,内联函数或内联变量(从C++17开始) 可以在包含在多个源中的头文件中定义 档案

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


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

“我还认识到,使用内联关键字可以从本质上消除函数,并在其使用站点上对其进行内联处理,从而解决此问题。”-不。这实际上不是
内联的功能。查看是否在多个cpp文件中包含头文件,并使用
static
,然后每个编译单元(通常称为翻译单元)将获得它自己的函数副本。但是,由于每个副本都是静态的,因此它具有内部链接,因此链接器不会看到多个定义错误。简单回答,只需使用
内联
,它是专为描述的情况而设计的。