2010-04-19 38 views
3

依靠預處理器和預定義的編譯器宏實現可移植性似乎很難管理。什麼是更好的方式來實現C項目的可移植性?我想將特定於環境的代碼放在表現相同方式的標頭中。有沒有辦法讓構建環境選擇包含哪些頭文件?C代碼的可靠可移植性不依賴於預處理器

我在想我會把環境特定的標題放到特定環境的目錄中。然後,構建環境會將平臺目錄中的標題複製到根目錄中,構建項目,然後刪除副本。

回答

6

這完全取決於您的構建環境,當然與C本身無關。

有一兩件事你可以嘗試是建立你的包含路徑在您的makefile文件這樣的:

INCDIRS=-I ./solaris 
#INCDIRS=-I ./windows 
#INCDIRS=-I ./linux 
: 
CC=gcc $(INCDIRS) ... 

,並取消你的工作之一。然後把你的平臺特定的頭文件在這些目錄:

你可以,在必要的時候,甚至有不同平臺的makefile如solaris.mkwindows.mk,而不必在所有編輯的任何文件。

但我不認爲你對預處理器的反感,這是它擅長的事情之一,人們幾十年來一直在成功地做到這一點。最重要的是,當您的代碼需要更改每個平臺時會發生什麼情況。你可以將代碼抽象成頭文件,但這對我來說似乎難以管理。

3

這基本上是一個配置腳本的功能 - 即計算出系統的細節,然後修改該系統的makefile。看看GNU autoconf的文檔,它可能會做你想做的,雖然我不確定如果有必要的話,它是多麼的可移植。

2

pax's answer是好的,但我會補充一點,你可以

  1. 混合和匹配處理在構建系統中的一些系統依賴(大的事情,一般),並與其他預處理器(小東西)
  2. 關注麻煩在代碼和系統相關位之間定義一個精簡的粘合層,並將所有的預處理器廢話粘在那裏。所以你總是打電話MyFileOpen(),其中調用fopen上的unix和其他窗口上的東西。現在,您的代碼中只有與文件打開相關的任何預處理程序的部分是MyFileOps模塊。
+0

這就是我將要做的,但我試圖避免在獨立於平臺的代碼中放置太多樣板。擁有特定於平臺的頭文件中的大部分/所有平臺特定的代碼對我來說似乎更好。這樣,如果某個平臺上的某些內容發生更改/中斷,我可以更改標題以反映該更改。抽象是很好的,在這種情況下。 – Yktula 2010-04-19 02:16:52

+0

我會建議你的目標是零主要源代碼中的ifdefs。每個平臺變體應該隱藏在頭文件中,或者隱藏在具有多個實現的API後面。 (我也同意@ dmckee的建議,即將大型平臺選擇放入makefile或構建配置腳本。) – 2010-04-19 02:26:42