【问题标题】:multiple definitions of an inlined function in 2 or more TU2个或更多TU中的内联函数的多个定义
【发布时间】:2019-06-11 21:56:17
【问题描述】:

我正在阅读有关内联函数以及它们如何在不同的翻译单元中具有多个定义但这些定义必须相同的内容。

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

所以我尝试如下:

global.h

#ifndef DRAKOS_GLOBAL_H
#define DRAKOS_GLOBAL_H

#include <iostream>
void fct();

#endif //DRAKOS_GLOBAL_H

file1.cpp

#include "global.h"

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

ma​​in.cpp

#include "global.h"

extern void fct();

int main()
{
    fct();
}

正在构建 ---> 错误:

对`fct()'的未定义引用

好的,我在 google 上看了看,我读到了

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

到现在为止一切都清楚和合乎逻辑,但问题是,如果我把定义放在头文件中;每个 TU 都将具有相同的定义,我将无法定义两个版本的内联函数,比如一个在 file1.cpp TU 中,另一个在 main.cpp TU 中。

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

问题 2:如果可以这样做并定义 inled 函数的多个定义(由于我的理解缺失),请给我一个简单的例子 :)

提前致谢

【问题讨论】:

  • 你为什么有这个内联?它只会在file1.cpp 中定义。如果你打算让它内联,把它放在global.h
  • 这是一个测试问题。正如我所说,下面的代码有一个错误,要修改它,我必须在标题中定义函数。最大的问题是如何对内联函数进行多重定义
  • 将 file1.cpp 名称更改为 global.cpp,或者在 main 中包含 file1.cpp。
  • 您的 main.cpp 没有定义 fct()。 extern void fct() 无效,因为您已经包含 global.h 并且没有为 fct() 提供正文

标签: c++ inline-functions


【解决方案1】:

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

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

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

另外你在main.cpp 中没有任何fct 的定义。您可以复制并粘贴到main.cpp(以及项目中的所有其他.cpp):

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

但这是不好的做法,因为意外更改其中一个功能或忘记 .cpp 文件会更容易。将它放在头文件中可以避免这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多