編寫移植性好的C代碼

來源:互聯網
上載者:User
眾所周知,通過使用條件編譯,可以讓我們的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中可能就是一句代碼,那就是不同的平台分別調不同的函數名。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.