2016-08-30 7 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

이동 : 여기

// 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