多平台支持,预处理程序或与单个库

时间:2016-08-30 05:34:14

标签: c c-preprocessor multiplatform

我正在为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构建时,将指定适当的库和设置。

这里明显的缺点是,如果需要更改库中某些内容的实现,如果需要添加某些内容,或者真正关于库的任何内容,则需要不断维护和重建它,以及主要的实际计划。

如果有更好的方法来解决这个问题,会是什么? 如果我提到的方式是标准的做法,那么长期发展会更常见/更好吗?

1 个答案:

答案 0 :(得分:0)

这是我会做的[并且已经完成]。执行[很多] spyOn($, 'ajax').and.callFake(function (request) { var d = $.Deferred(); d.resolve(put your expected data here); return d.promise(); }); / #ifdef / #else序列很难维护。相信我,我已经做到了,直到找到更好的方法。以下是我过去使用过的方法。还有其他类似的方法。

以下是通用代码:

#endif

以下是GBA特定代码:

// 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();
}

以下是SDL代码:

// example_gba.c -- GBA specific code

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