【问题标题】:Inlined constructors? Explain this behavior[C++]内联构造函数?解释这种行为[C++]
【发布时间】:2011-03-08 15:32:54
【问题描述】:

考虑这段代码

#include <iostream> 
#include <cstdio>
using namespace std;

class Dummy {
public:
    Dummy();
};

inline Dummy::Dummy() {
    printf("Wow! :Dummy rocks\n");
}

int main() {
    Dummy d;
}

这里一切都好!

现在我做这个修改。我将 Dummy 的声明移至“dummy.h”。

class Dummy {
public:
    Dummy();
};

并在“dummy.cpp”中定义构造函数 Dummy() 如下

#include "dummy.h"
inline Dummy::Dummy() {
    printf("Wow! :Dummy rocks\n");
}

最后,我的主文件为:

#include <iostream> 
#include <cstdio>
#include "dummy.h"
using namespace std;

int main() {
    Dummy d;
}

它编译得很好,但我收到一个链接器错误,抱怨对 Dummy::Dummy() 的未定义引用。

任何见解。

--

【问题讨论】:

    标签: c++ inline-method


    【解决方案1】:

    您应该考虑在 C++ 中编译是如何工作的,以及在 C++ 中使用的单独编译单元的想法以及使用头文件和 cpp 文件获得的封装。

    看这里: http://www.parashift.com/c++-faq-lite/inline-functions.html#faq-9.6

    内联告诉编译器不要调用函数将其代码“复制-粘贴”到函数调用的位置。当您将内联定义放在 CPP 文件中时,它在链接到其他编译单元期间将不可见(它在 cpp 文件中而不是在 h 文件中),因此编译器从放置在类中的签名中了解到没有参数 Con 的所以它不会实现默认的。但是链接器找不到函数体,因为它是在 cpp 文件中实现的内联。

    【讨论】:

      【解决方案2】:

      您必须将所有内联函数(包括方法和构造函数/析构函数)放在一个头文件中,并在其中声明它们。

      虽然这段代码应该以任何方式工作,main() 调用构造函数就好像inline 关键字不存在一样。您确定要将目标文件从两个编译单元传递到链接器吗?

      【讨论】:

      • 是的。它与从构造函数中删除的 inline 关键字一起使用,这显然意味着链接器获取两个目标文件,关于在标题中定义内联方法,我明白你的意思,但是我想知道它与其他函数,只注意构造函数?
      • @Neeraj 这很可能是因为那些其他函数仅在与内联函数相同的 .cpp 文件中使用。
      【解决方案3】:

      尝试从您的实现文件中删除内联说明符。如果我的理解是正确的,你只能inline in a header

      【讨论】:

      • 您的理解部分正确。对于要内联的函数,它的定义在使用之前必须在编译单元中可见(即在标题中,带有声明)。但即使不是,another 编译单元中的定义也会产生一个函数的外联实例,第一个编译单元将简单地调用这个实例,就像inline 关键字一样不在那里。
      • 感谢您的澄清。
      • @slacker:另一个编译单元中的定义可能会产生一个离线实例。它是否存在尚未明确,依赖它的代码格式不正确。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      • 2013-07-14
      • 1970-01-01
      • 2020-02-23
      • 2012-03-16
      相关资源
      最近更新 更多