Forward Declaration
今天要介紹的是可以在重新編譯整個專案 source code 時,避免不必要的重新編譯。先想像一個情境,假設一個專案有兩個檔案,分別為:
classA.h
main.cpp
在 classA.h 檔中,定義了class A,而在main.cpp中,定義了另一個class B,class B 的member 包含了A,這時候我們直覺就是在 main.cpp 的裡面加一行
#include "classA.h"這樣也是正確的寫法,不過當我們更改 classA.h 檔後,所有 include 到 classA.h 的檔案,都必須重新編譯,main.cpp 也不例外,這個缺點在當專案擴增到一定程度後,就會嚴重拖慢編譯的速度,而 forward declaration 就是解決這個問題的好方法。
那該如何使用 forward declaration 呢?
就是將原本 include classA.h 的地方,改成:
class A;
這樣一來,就可以避免掉不必要的重新編譯,讓專案編譯的速度提升了。
是所有的情況都可以使用 forward declaration 的技巧嗎?
當然不是,以下舉出幾個可以適用 forward declaration 的原則:
1. 當 class A 是以 pointer 或 reference 的形式出現:
class B{ A* aVar; A& aVar2; }2. 當在宣告函式時, class A 是以參數的形式傳入或回傳:
void func1(A); A func2();
另外,因為 forward declaration 並無法讓編譯器知道 class A 的大小、成員、以及方法,所以在必須讓用到以上資訊的情況下,我們就切記不能使用 forward declaration ,只能乖乖的用 include 的方式。
詳細的說明,Luc Touraille 大大有在 stackoverflow 回答過了,請參考 : When can I use a forward declaration?
以上就是這次的 c/c++ 技巧。
沒有留言:
張貼留言