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

Why is it not possible to inline function definitions in .cpp file?

为什么无法在 .cpp 文件中内联函数或 class 成员函数定义?例如在我下面的测试示例中,如果我尝试内联函数或 class cpp文件中的成员定义:

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
}

main.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,但我仍然不确定它是如何工作的。

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

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

的函数指针

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

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

编辑

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

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

来自cppreference.com

The definition of an inline function or variable (since C++17) must be present in the translation unit where it is accessed (not necessarily before the point of access).

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

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

可以 cpp 文件中内联函数。

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

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