2015年2月26日 星期四

[c/c++ 技巧] Forward Declaration

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++ 技巧。

沒有留言:

張貼留言