1

我正在使用 C 创建一个跨平台库。我有一段如下代码,其中我直接使用 libc 内存管理函数:

myObject* myObjectCreate(void)
{
    ...
    myObject *pObject = (myObject*)malloc(sizeof(*pObject));
    ...
}

void myObjectDestroy(myObject *pObject)
{
    ...
    free(pObject);
    ...
}

我知道这些内存管理功能并不总是可用的,尤其是在基于低端微控制器的嵌入式系统上。不幸的是,我的库需要在这些系统上编译。

为了解决这个问题,我想我必须让我的库客户端自定义这些函数。

那么,实现这一目标的推荐方法是什么?

4

3 回答 3

2

有很多方法。

我使用#if,结合编译器提供的定义,来拥有每个平台的行为。

如果找到给定的功能(例如 malloc),则可以定义 #define MYLIB_MALLOC。

然后,稍后,您可以检查#ifdef MYLIB_MALLOC,如果不存在,则提供一个虚拟 malloc 函数,该函数将允许您的代码编译。

于 2012-09-24T08:50:59.233 回答
1

使用函数指针。

在库中定义以下指针:

void* (*CustomMalloc)(size_t) = NULL;
void (*CustomFree)(void*) = NULL;

并且在使用库函数之前初始化这些指针以指向和的自定义malloc()实现free()。或者将它们初始化为指向真实的malloc()and free()

在库内部替换malloc(size)CustomMalloc(size)和。free(pointer)CustomFree(pointer)

于 2012-09-24T08:53:28.690 回答
0

使用条件编译,即定义一些宏的like LIBC_AVAILLIBC_NOT_AVAIL并在编译时包含不同的代码。

于 2012-09-24T08:51:51.673 回答