0

我正在为 C 和 C++ 编写内存管理器。C 不支持函数重载,因此为了补偿重新定义 malloc,我使用了如下样式:

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

#define my_malloc(x) malloc(x)

这让我mallocmalloc(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 中,您只需使用“assign_sometype()”,它接受两个参数 a 和 b 并将 a 分配给 b(反之亦然)。因此,在 C++ 中,您将拥有:

a = b;

在 C 中,这将是:

assign_sometype(a, b);

对于相等运算符 ( ==),您将使用 "equals_sometype()" 比较它的两个参数并返回 true 或 false。所以如果在 C++ 中你有:

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

然后在 C 中是:

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

(记得酌情使用指针作为参数。)

这是同一件事,只是用 C++ 编写不同,试图让它看起来更自然。请注意,许多 C++ 程序员不太喜欢运算符重载。我自己也不是很热衷。它在某些情况下确实有助于提高可读性,但它也可能被严重滥用。(如果您搜索网络,您可以找到许多关于滥用运算符重载的文章。)

于 2013-07-28T18:25:19.533 回答