我正在为C和C ++编写内存管理器。 C不支持函数重载,所以为了补偿重新定义malloc,我使用了如下样式:
void * my_malloc(size_t size) {
void * p = malloc(size);
// Do additional stuff
...
}
#define my_malloc(x) malloc(x)
这让我可以使用malloc
来呼叫我的malloc(sizeof(type))
。这有效。但是,我也喜欢在调用操作符时执行操作,最好是在执行赋值操作之后。我知道GCC支持__attribute__((destructor))
。
所以我的问题是,有没有办法在调用运算符之前/之后执行函数(最好也是传递参数),还是可以使用宏重新定义运算符?
答案 0 :(得分: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 ++程序员不太喜欢运算符重载。我自己也不太热衷于此。它确实有助于在某些情况下的可读性,但它也可能被滥用。 (如果你在网上搜索,你可以找到很多关于滥用运算符重载的文章。)