2016-08-30 12 views
1

私はGBA用の自作ゲームを開発中で、PCに移植することを考えていました(おそらくSDLを使用しています)。 以前はマルチプラットフォームのサポートの問題に取り組んでいなかったので、私は実際に経験がありません。マルチプラットフォームのサポート、プリプロセッサ、または個々のライブラリとのリンク

2つの可能な方法が出てきましたが、どちらも欠点があります。欠けている解決策があるかどうかはわかりません。

まず、プリプロセッサを使用します。ヘッダーファイルは#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

移動図書館溶液で:ここで

// example_gba.c -- GBA specific code static void example_dep(void) { // ... } 

はSDLコードです。長期的には、より保守的になるでしょう。 –

答えて

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_sdl.c -- SDL specific code 

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

ありがとう!非常にエレガントなソリューション。 – supershirobon

関連する問題