我正在使用C创建一个跨平台库。我有一段代码,如下所示,我直接使用libc内存管理功能:
myObject* myObjectCreate(void)
{
...
myObject *pObject = (myObject*)malloc(sizeof(*pObject));
...
}
void myObjectDestroy(myObject *pObject)
{
...
free(pObject);
...
}
据我所知,这些内存管理功能并不总是可用,特别是在基于低端微控制器的嵌入式系统上。不幸的是,我的库需要在这些系统上进行编译。
要解决这个问题,我想我必须让我的库客户端自定义这些功能。
那么,推荐的方法是什么?
答案 0 :(得分:2)
有很多方法。
我使用#if,结合编译器提供的定义,来实现每个平台的行为。
如果找到给定的功能(例如malloc),可以定义#define MYLIB_MALLOC。
然后,稍后,您可以检查#ifdef MYLIB_MALLOC,如果不存在,则提供一个虚拟malloc函数,它将允许您的代码进行编译。
答案 1 :(得分:1)
使用函数指针。
在库中定义以下指针:
void* (*CustomMalloc)(size_t) = NULL;
void (*CustomFree)(void*) = NULL;
在使用库函数之前,初始化这些指针以指向malloc()
和free()
的自定义实现。或者将它们初始化为指向真实的malloc()
和free()
。
在库内部,将malloc(size)
替换为CustomMalloc(size)
,将free(pointer)
替换为CustomFree(pointer)
。
答案 2 :(得分:0)
使用条件编译,即定义一些宏,如LIBC_AVAIL
,LIBC_NOT_AVAIL
,并在编译时包含不同的代码。