从包装宏中调用Malloc

时间:2018-05-01 16:23:56

标签: c macros malloc c-preprocessor

我正在尝试编写一些宏来调试我正在处理的一些代码,但是我遇到了一个问题,我不知道如何解决它。我想用另一个函数包装malloc,然后使用宏来用包装器替换任何调用。问题是包装器本身必须调用malloc。我有一个像这样的头文件:

memory.h:

#define malloc(X) my_malloc( X, __FILE__, __LINE__, __FUNCTION__ )
#define free(X) my_free( X )

void *my_malloc(size_t size, const char *file, int line, const char*func);
void my_free(void *ptr);

然后我有一个关联的.c文件来定义包装器函数。

memory.c:

#include "memory.h"
void *my_malloc(size_t size, const char *file, int line, const char*func) {
    void *ptr = malloc(size);
    /* do stuff */
    return ptr;
}

void my_free(void *ptr) {
    /* do stuff */
    free(ptr);
}

最后,我有代码,我希望宏工作。

的main.c

int main(int argc, char **argv) {
    int *my_ptr = malloc( sizeof(int) );
    free(my_ptr);
    return 0;
}

我遇到的问题是该函数变为递归并导致程序崩溃。我的问题是,有没有一种方法可以让我的实现与我的头文件分开,并且仍然可以从内部访问真正的malloc函数(即所以.c文件知道调用正确的malloc而不是预处理器替换它)?

提前致谢!

1 个答案:

答案 0 :(得分:1)

执行此操作的方法是#undef中的malloc freememory.c个宏:

memory.c:

#undef malloc
#undef free

void *my_malloc(size_t size, const char *file, int line, const char*func)
{
    ...
}
...
void my_free(void *ptr)
{
    ...
}

另一种方法是将my_mallocmy_free函数声明为extern。这样,包含memory.hmalloc的{​​{1}}不应包含在free中。

memory.c:

memory.c

memory.h

/* #include "memory.h" */

extern void *my_malloc(size_t size, const char *file, int line, const char*func)
{
    ...
}
...
extern void my_free(void *ptr)
{
    ...
}