2016-08-30 31 views
1

我正在爲GBA開發自制遊戲,並且正在考慮將它移植到PC(可能使用SDL)。 我之前沒有處理過多平臺支持的問題,所以我沒有任何經驗。多平臺支持,預處理器或與單個庫鏈接

我想出了兩種可能的解決方法,但都有缺點,我不知道是否有更好的解決方案,我錯過了。

首先會使用預處理器。一個頭文件將被包含在所有文件中,這些文件將被包含在#define GBA中,並且基於它是否被定義,將包括適當的頭文件,並且針對該平臺編譯適當的特定於平臺的代碼。

我會實現它像

/* GBA definition is in platform.h */ 
/* Example.c */ 

void example() 
#ifdef GBA 
{ 
    /* GBA specific implementation goes here */ 
} 
#else 
{ 
    /* PC specific implementation goes here */ 
} 
#endif 

我看到這裏是一個大型項目的缺點,這會造成非常雜亂而且是在公然的那種醜陋而難以閱讀。

我能想到的另一個選擇是爲每個平臺創建靜態庫。因此,這兩種平臺的主要源代碼都是相同的,同時開發更容易,並且在爲GBA或PC構建時,將指定適當的庫和設置,就是這樣。

明顯這裏的缺點是,如果有需要在庫中的一些執行情況的變化,如果有什麼需要添加,或任何真正關於庫,它需要保持並不斷重建,沿與主要的實際計劃。

如果有更好的方法來解決這個問題,它會是什麼? 如果我提到的方法是標準的做法,哪種方法對長期發展更普遍/更好?

+3

圍棋與庫解決方案。從長遠來看,它將更易於維護。 –

回答

0

以下是我將要做的事[已完成]。做[很多] #ifdef/#else/#endif序列很難維護。相信我,我已經做到了,直到我找到更好的方式。以下是我過去使用過的一種方式。還有其他類似的方法。

這裏是通用代碼:

// example.c -- generic code 

#ifdef _USE_GBA_ 
#include <example_gba.c> 
#endif 

#ifdef _USE_SDL_ 
#include <example_sdl.c> 
#endif 

void 
example(void) 
{ 
    // NOTE: this will get optimized using tail recursion into a jump or 
    // example_dep will get inlined here 
    example_dep(); 
} 

這裏是GBA具體代碼:

// example_gba.c -- GBA specific code 

static void 
example_dep(void) 
{ 
    // ... 
} 

這裏是SDL代碼:

// example_sdl.c -- SDL specific code 

static void 
example_dep(void) 
{ 
    // ... 
} 
+0

非常感謝!相當優雅的解決方案。 – supershirobon