眾所周知,通過使用條件編譯,可以讓我們的C代碼支援不同的平台。但是在代碼中大量運用#ifdef, #endif這樣的預先處理指令顯然是不妥的,因為這些代碼分散在所有的代碼中,非常難維護。將來如果要再添加一個平台的支援,要在所有代碼中search 這些預先處理指令。所以,很容易想到的一種改良方法是專門做一個.h檔案來做這個事情,比如platform_specific.h:
#ifdef WIN32
inline function1() { ...... }
inline function2() { ...... }
#endif
#ifdef LINUX
inline function1() { ...... }
inline function2() { ...... }
然後將和平台無關的代碼寫在一個類似platform_independent.c中
這樣做也不是非常好,因為在platform_specific.h中還是有大量的#ifdef, #endif
最好的解決方案是這樣:在platform_specific.h中這樣寫:
#ifdef WIN32
#include "win32_platform.h"
#endif
#ifdef LINUX
#include "linux_platform.h"
#endif
這樣,和平台相關的邏輯就被放到了一個個單獨的檔案中。這樣的好處是,首先platform_specific.h中#ifdef, #endif的代碼大量減少;在一個team工作的時候,很容易分工,開發平台相關代碼的人員各自有各自的原始碼,不會和其他人衝突;CVS中只需要維護 一顆代碼樹,無需建立分支,免去分支建立、合并的麻煩;通過這種方式,還可以再進一步抽象,如Solaris和AIX兩個平台,可以再抽象建立一個 unix_platform.h,裡面放Solaris和AIX共有的一些東西,我們首先include這個unix_platform.h,然後將 Solaris和AIX不同的地方再分別建檔案,諸如solaris_platform.h和aix_platform.h;最後一個好處是,如果將來要 新增一個platform的支援,非常簡單,再新增一個xxx_platform.h即可!
OK,這樣做有一個注意點,就是,在 win32_platform.h, linux_platform.h這些代碼中,可以將所有的function都做成inline的,這些function要簡短,扼要,而且千萬不要包含 任何平台無關的代碼(因為平台無關的代碼應該被抽象出去,不是放在這裡),比如,我們針對一個系統調用,在不同的平台可能函數名不一樣,那麼,在這裡的 function中可能就是一句代碼,那就是不同的平台分別調不同的函數名。