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()または、実数とを指すように初期化しますfree()

malloc(size)ライブラリ内で、CustomMalloc(size)およびfree(pointer)に置き換えCustomFree(pointer)ます。

于 2012-09-24T08:53:28.690 に答える
0

条件付きコンパイルを使用します。つまり、いくつかのマクロの likeLIBC_AVAILを定義LIBC_NOT_AVAILし、コンパイル時に別のコードを含めます。

于 2012-09-24T08:51:51.673 に答える