多平台支持、预处理程序或与各个库的链接
Multiplatform support, preprocesser or linking with individual libraries
我正在为 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 构建时,将指定适当的库和设置,仅此而已。
这里明显的缺点是,如果需要更改库中某些内容的实现,如果需要添加某些内容,或者任何真正与库相关的内容,都需要不断维护和重建,连同主要的实际程序。
如果有更好的方法来解决这个问题,那会是什么?
如果我提到的方法是标准的方法,哪种方法更常见/更适合长期发展?
这是我会[并且已经做过] 的事情。做 [很多] #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)
{
// ...
}
我正在为 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 构建时,将指定适当的库和设置,仅此而已。
这里明显的缺点是,如果需要更改库中某些内容的实现,如果需要添加某些内容,或者任何真正与库相关的内容,都需要不断维护和重建,连同主要的实际程序。
如果有更好的方法来解决这个问题,那会是什么? 如果我提到的方法是标准的方法,哪种方法更常见/更适合长期发展?
这是我会[并且已经做过] 的事情。做 [很多] #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)
{
// ...
}