C++ 2个或多个TU中内联函数的多个定义
我在读内联函数,以及它们如何在不同的转换单元中具有多个定义,但这些定义必须相同 所以我的想法是,如果我在头文件中声明了一个函数,并在2个cpp文件中将其定义为内联函数,编译器不会生气 所以我试着做如下的事情: global.hC++ 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()”的未定义引
#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";
}