首頁  >  文章  >  後端開發  >  可以在 .cpp 檔案中定義內聯成員函數嗎?了解迴圈包含和編譯器行為。

可以在 .cpp 檔案中定義內聯成員函數嗎?了解迴圈包含和編譯器行為。

Susan Sarandon
Susan Sarandon原創
2024-10-30 14:03:52453瀏覽

 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>

A.h

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

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

B.h

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

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

B.cpp

這種情況下,由於A.h和B.h之間的循環include,需要在B .cpp中定義內聯成員函數getA()的實作。然而,這提出了一個基本問題:

編譯器內聯 getA() 是否正確?

不行。只有當函數的定義在使用時可用時,編譯器才會內聯該函數。在上面的範例中,當從其他 .cpp 檔案呼叫 getA() 時,其定義不可見,從而導致連結期間出現「未解析的外部」錯誤。

內嵌關鍵字的意義

只有類體之外的定義中存在的inline 關鍵字(在本例中為B.cpp 中)才有意義。標頭中的 inline 關鍵字(在 B.h 中)充當聲明,表示將在其他地方提供實作。

在 .cpp 檔案中定義內聯成員函數的替代方法 目前,沒有其他方法可以在 .cpp 檔案中定義內聯成員函數。該標準要求將它們的定義放置在標頭中以進行正確的內聯擴展。

以上是可以在 .cpp 檔案中定義內聯成員函數嗎?了解迴圈包含和編譯器行為。的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn