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