首页  >  文章  >  后端开发  >  可以在 .cpp 文件中定义内联成员函数吗?了解循环包含和编译器行为。

可以在 .cpp 文件中定义内联成员函数吗?了解循环包含和编译器行为。

Susan Sarandon
Susan Sarandon原创
2024-10-30 14:03:52455浏览

 Can You Define Inline Member Functions in .cpp Files? A Look at Circular Includes and Compiler Behavior.

在 .cpp 文件中定义内联成员函数:一个难题

虽然内联成员函数通常放置在标头中以便在编译期间直接包含,某些场景需要在 .cpp 文件中实现。其中一种情况涉及循环包含,其中内联成员函数的实现必须在 .cpp 文件中定义。

循环包含的困境

考虑以下示例:

A.h

<code class="cpp">#pragma once
#include "B.h"

class A {
    B b;
};</code>

B.h

<code class="cpp">#pragma once
class A; // forward declaration

class B {
    inline A getA();
};</code>

B.cpp

<code class="cpp">#include "B.h"
#include "A.h"

inline A B::getA() {
    return A();
}</code>

这种情况下,由于A.h和B.h之间的循环include,需要在B.cpp中定义内联成员函数getA()的实现。然而,这提出了一个基本问题:

编译器内联 getA() 是否正确?

不。仅当函数的定义在使用时可用时,编译器才会内联该函数。在上面的示例中,当从其他 .cpp 文件调用 getA() 时,其定义不可见,从而导致链接期间出现“未解析的外部”错误。

内联关键字的意义

只有类体之外的定义中存在的 inline 关键字(在本例中为 B.cpp 中)才有意义。标头中的 inline 关键字(在 B.h 中)充当声明,表示将在其他地方提供实现。

在 .cpp 文件中定义内联成员函数的替代方法

目前,没有其他方法可以在 .cpp 文件中定义内联成员函数。该标准要求将它们的定义放置在标头中以进行正确的内联扩展。

以上是可以在 .cpp 文件中定义内联成员函数吗?了解循环包含和编译器行为。的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn