在 .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中文网其他相关文章!