【问题标题】:Multiplatform support, preprocesser or linking with individual libraries多平台支持、预处理器或与单个库的链接
【发布时间】:2016-08-30 05:34:13
【问题描述】:

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

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

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

【问题讨论】:

  • 使用图书馆解决方案。从长远来看,它将更易于维护。

标签: c c-preprocessor multiplatform


【解决方案1】:

这就是我会做的[并且已经做过的]。做[很多]#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)
{
    // ...
}

【讨论】:

  • 非常感谢!相当优雅的解决方案。
猜你喜欢
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 2012-02-11
  • 2010-12-26
相关资源
最近更新 更多