Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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++ 2个或多个TU中内联函数的多个定义_C++_Inline Functions - Fatal编程技术网

C++ 2个或多个TU中内联函数的多个定义

C++ 2个或多个TU中内联函数的多个定义,c++,inline-functions,C++,Inline Functions,我在读内联函数,以及它们如何在不同的转换单元中具有多个定义,但这些定义必须相同 所以我的想法是,如果我在头文件中声明了一个函数,并在2个cpp文件中将其定义为内联函数,编译器不会生气 所以我试着做如下的事情: global.h #ifndef DRAKOS_GLOBAL_H #define DRAKOS_GLOBAL_H #include <iostream> void fct(); #endif //DRAKOS_GLOBAL_H 构建-->错误: 对“fct()”的未定义引

我在读内联函数,以及它们如何在不同的转换单元中具有多个定义,但这些定义必须相同

所以我的想法是,如果我在头文件中声明了一个函数,并在2个cpp文件中将其定义为内联函数,编译器不会生气

所以我试着做如下的事情:

global.h

#ifndef DRAKOS_GLOBAL_H
#define DRAKOS_GLOBAL_H

#include <iostream>
void fct();

#endif //DRAKOS_GLOBAL_H
构建-->错误:

对“fct()”的未定义引用

好吧,我在谷歌上四处看看,我读到了

函数的定义必须放在标题中 文件,除非该函数仅在单个.cpp文件中使用

到目前为止,一切都很清楚,逻辑性很强,但问题是,如果我把定义放在头文件中;每个TU都有相同的定义,我不能定义两个版本的内联函数,比如说一个在file1.cpp TU中,另一个在main.cpp TU中

问题1:为什么他们会说,对于内联函数,可以在不同的TU中有多个定义,但必须相同(就像我把定义放在头中一样,在cpp文件中它将是,不能做不同的事情)

问题2:如果有可能这样做并定义一个内联函数的多个定义(由于我方未理解),somone plz能给我举个简单的例子吗:)


提前感谢

由于规则C++17[dcl.inline]/6,此代码导致未定义的行为(无需诊断):

[…]如果在一个翻译单元中内联声明具有外部链接的函数或变量,则应在其出现的所有翻译单元中内联声明该函数或变量;无需诊断

您在
file1.cpp
中声明了
fct
,但在
main.cpp
中没有声明

另外,您在
main.cpp
中没有任何关于
fct
的定义。您可以复制并粘贴到
main.cpp
(以及项目中每隔一个.cpp):

inline void fct()
{

std::cout为什么要内联?它只会在
file1.cpp
中定义。如果要内联它,请将其放入
global.h
中,这是一个测试问题。正如我所说,下面的代码有一个错误,要重做它,我必须在标题中定义函数。最大的问题是如何对内联函数将file1.cpp名称更改为global.cpp,或在main中包含file1.cpp。main.cpp没有定义fct()。
extern void fct()
无效,因为您已经包含global.h,并且没有为fct()提供正文。可能存在以下重复项:
#include "global.h"

inline void  fct()
{
    std::cout << "file1.cpp \n";
}
#include "global.h"

extern void fct();

int main()
{
    fct();
}
inline void  fct()
{
    std::cout << "file1.cpp \n";
}