为什么不能在 .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
编辑
内联函数会没有函数指针吗?不,你可以完美地获取这个函数的地址并使用它并传递它。虽然,由于函数的内联特性,您不能依赖此函数指针与同一函数的另一个地址比较相等。
在这种情况下,您将在目标文件中的某处找到函数指针。但是,在这种情况下,编译器不需要为其提供正确的损坏名称,因此它可以从另一个编译单元使用。
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
函数。
内联函数必须出现在每个文件中。这就是为什么他们经常进入头文件,所以任何需要使用它的源都包括包含它的头文件。
为什么无法在 .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
编辑
内联函数会没有函数指针吗?不,你可以完美地获取这个函数的地址并使用它并传递它。虽然,由于函数的内联特性,您不能依赖此函数指针与同一函数的另一个地址比较相等。
在这种情况下,您将在目标文件中的某处找到函数指针。但是,在这种情况下,编译器不需要为其提供正确的损坏名称,因此它可以从另一个编译单元使用。
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
函数。
内联函数必须出现在每个文件中。这就是为什么他们经常进入头文件,所以任何需要使用它的源都包括包含它的头文件。