C在操作员呼叫之前或之后执行功能?重新定义运营商?

时间:2013-07-28 18:17:10

标签: c gcc

我正在为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))

所以我的问题是,有没有办法在调用运算符之前/之后执行函数(最好也是传递参数),还是可以使用宏重新定义运算符?

1 个答案:

答案 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 ++程序员不太喜欢运算符重载。我自己也不太热衷于此。它确实有助于在某些情况下的可读性,但它也可能被滥用。 (如果你在网上搜索,你可以找到很多关于滥用运算符重载的文章。)