【问题标题】:Why is it not possible to inline function definitions in .cpp file?为什么不能在 .cpp 文件中内联函数定义?
【发布时间】:2018-06-03 11:17:28
【问题描述】:

为什么不能在 .cpp 文件中内联函数或类成员函数定义?例如,在下面的测试示例中,如果我尝试在 cpp 文件中内联函数或类成员定义,链接器将返回一个 undefined reference 错误:

test.h

void print();

class A
{
    public:
        void print() const;
};

test.cpp

#include <test.h>

inline void print()
{
    // implementation
}

inline void A::print() const
{
    // implementation
}

ma​​in.cpp

#include <test.h>

int main(int argc, char** argv)
{
    print(); // undefined reference to `print()'
    A a;
    a.print(); // undefined reference to `A::print() const'

    return 0;
}

我已经阅读了一些answers here,但我仍然不确定它是如何工作的。

【问题讨论】:

标签: c++ linker inline inline-functions


【解决方案1】:

Q) 为什么不能在 .cpp 文件中内联函数定义?

可以cpp 文件中内联函数。

您不能做的是从不同的 cpp 文件访问那些inline 函数。

内联函数必须出现在每个使用它的文件中。这就是为什么它们经常放在头文件中,因此任何需要使用它的源都包括包含它的头文件。

【讨论】:

    【解决方案2】:

    inline 关键字确实令人困惑,但对于这个用例,如果您知道其含义,仍然很清楚。

    inline 影响需要生成的代码的要求。更具体地说,它告诉您的编译器它不应该预见该函数的函数指针。与往常一样,允许将内容复制到调用者中。由于内联,不必创建原始函数。 所以你没有指向 test.o 的函数指针。

    在 main.o 中,您调用此函数。因此,它会尝试解析未创建的函数指针,从而导致此链接器错误。

    可以通过例如 clang 的编译器警告来查找这些情况:-Wundefined-inline

    编辑

    内联函数会没有函数指针吗?不,你可以完美地获取这个函数的地址并使用它并传递它。虽然,由于函数的内联字符,您不能依赖此函数指针与同一函数的另一个地址进行比较。

    在这种情况下,您将在目标文件中的某个位置找到函数指针。但是,在这种情况下,编译器不需要为其提供正确的重命名名称,因此可以从另一个编译单元中使用它。

    【讨论】:

    • 那么当函数被内联时,无论其内容是否被复制,都不会有函数指针指向函数?
    • 可能有,这取决于你的编译器。虽然,你不能依赖它。但是,如果您接受地址,就会产生一些额外的丑陋,让我补充一下。
    • 哦,好吧。但是即使函数指针可能存在,链接器也会在这种情况下抱怨?
    【解决方案3】:

    来自cppreference.com

    内联函数或变量(C++17 起)的定义必须是 存在于访问它的翻译单元中(不一定 在访问点之前)。

    您的函数在 test.cpp 中定义,但您正在从 main.cpp 访问它们。

    【讨论】:

      猜你喜欢
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多