首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多平台支持、预处理器或与单个库链接

多平台支持、预处理器或与单个库链接
EN

Stack Overflow用户
提问于 2016-08-30 13:34:14
回答 1查看 36关注 0票数 1

我正在为GBA开发一个自制游戏,也在考虑将其移植到PC上(可能使用SDL)。我以前没有处理过多平台支持的问题,所以我真的没有任何经验。

我想出了两种可能的方法,但都有缺点,我不知道是否有更好的方法来解决我错过的问题。

首先是使用预处理器。头文件将被包括在将被#define GBA的所有文件中,并且基于它是否被定义,适当的头文件将被包括并且适当的平台特定的代码将被编译用于该平台。

我会像这样实现它

代码语言:javascript
复制
/* 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构建时,将指定适当的库和设置,仅此而已。

这里明显的缺点是,如果需要在库中的实现中进行更改,如果需要添加某些东西,或者任何真正关于库的东西,它需要不断地维护和重新构建,以及主要的实际程序。

如果有更好的方法来解决这个问题,那会是什么呢?如果我提到的方法是标准的方法,那么对于长期开发,哪种方法更常见/更好?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-30 14:13:14

这是我会做和已经做的事情。做很多#ifdef/#else/#endif序列是很难维护的。相信我,我已经做到了,直到我找到更好的方法。下面是我过去用过的一种方法。还有其他类似的方法。

下面是通用代码:

代码语言:javascript
复制
// 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的代码:

代码语言:javascript
复制
// example_gba.c -- GBA specific code

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

下面是SDL代码:

代码语言:javascript
复制
// example_sdl.c -- SDL specific code

static void
example_dep(void)
{
    // ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39219416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档