我正在尝试编写一些宏来调试我正在处理的一些代码,但是我遇到了一个问题,我不知道如何解决它。我想用另一个函数包装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而不是预处理器替换它)?
提前致谢!
答案 0 :(得分:1)
执行此操作的方法是#undef
中的malloc
free
和memory.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_malloc
和my_free
函数声明为extern
。这样,包含memory.h
和malloc
的{{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)
{
...
}