0

私は、C と C++ の両方のメモリ マネージャーの作成に取り組んでいます。C は関数のオーバーロードをサポートしていないため、malloc の再定義を補うために、次のようなスタイルを使用しました。

void * my_malloc(size_t size) {
    void * p = malloc(size);
    // Do additional stuff
    ...
}

#define my_malloc(x) malloc(x)

mallocこれにより、 myを で呼び出すことができますmalloc(sizeof(type))。これは機能します。ただし、オペレーターが呼び出されたとき、できれば代入操作が行われた後もやりたいと思います。GCC が をサポートしていることは知っています__attribute__((destructor))

だから私の質問は、演算子が呼び出される前/後に関数を実行する方法はありますか (できればパラメーターも渡されます)、またはマクロを使用して演算子を再定義できますか?

4

1 に答える 1

4

関数のオーバーロードは単なる構文糖衣です。それらについて特別なことは何もありません。本当に必要なのは、マクロを定義せずに my_malloc() を使用することだけです。malloc() に戻す必要がある場合、マクロを定義します。

#define my_malloc(x) malloc(x)

演算子のオーバーロードも単なる構文糖衣です。操作を行う関数を導入できます。唯一の違いは、たとえば、C++ では関数の名前が「operator+」であるのに対し、C では「add()」のような名前にする必要があることです。それについて特別なことは何もありません。

代入演算子を例に取りましょう。C++ では、関数は「operator=()」という名前になります。C では、2 つの引数 a と b を取り、a を b (またはその逆) に代入する "assign_sometype()" を使用するだけです。したがって、C++ では次のようになります。

a = b;

C では次のようになります。

assign_sometype(a, b);

等値演算子 ( ==) には、2 つの引数を比較して true または false を返す "equals_sometype()" を使用します。したがって、C++ の場合:

if (a == b) // ...

次に、Cでは次のようになります。

if (equals_sometype(a, b)) // ...

(必要に応じて、ポインターを引数として使用することを忘れないでください。)

それは同じことです。より自然に見えるようにするために、C++ で別の方法で記述されているだけです。また、多くの C++ プログラマーは、演算子のオーバーロードをあまり好まないことに注意してください。私自身はあまり熱心ではありません。場合によっては読みやすさに役立ちますが、ひどく悪用されることもあります。(ネットを検索すると、オペレーターのオーバーロードに関する記事がたくさん見つかります。)

于 2013-07-28T18:25:19.533 に答える