提问人:Himanshu 提问时间:9/12/2023 最后编辑:chqrlieHimanshu 更新时间:9/13/2023 访问量:37
如何从 stdlib 取消定义 calloc() 函数以使用我们自己的函数
How to undef calloc() function from stdlib to use our own function
问:
我有一个头文件 calloc.h,我在其中使用 stdlib 的 malloc() 函数定义了 calloc() 函数。但是我遇到了错误。multiple definition of 'calloc'
calloc.h:
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
void *calloc(size_t num, size_t size)
{
/* num * size unsigned integer wrapping check */
if ((num >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) && num > 0 && SIZE_MAX / num < size)
{
return NULL;
}
size_t total_size = num * size;
void *ptr = malloc(total_size);
if (ptr)
{
memset(ptr, 0, total_size);
}
return ptr;
}
有什么方法可以解决这个问题吗?
我试过这个:
#define calloc _calloc_
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#undef calloc
但是我收到以下错误:
cstdlib:144:11: error: 'calloc' has not been declared in '::'
stdlib.h:59:12: error: 'calloc' has not been declared in 'std'
答:
0赞
chqrlie
9/13/2023
#1
您得到的链接时间错误似乎表明 C 库中定义的模块已链接到您的程序中,不是因为您重新定义了 ,而是因为您至少使用了在同一模块中定义的另一个符号。两者可能在 C 库的同一模块中定义,这意味着您不能通过调用 来重新定义。calloc()
calloc
calloc
malloc
calloc()
malloc()
另请注意,您似乎正在将 C 源文件编译为 C++。
在系统上,您可能必须重新定义 、 、 以及可能的其他库函数(如 ,),因此不会将任何原始分配模块提取到可执行文件中。这是一项艰巨的任务。malloc()
calloc()
realloc()
free()
strdup()
aligned_alloc()
如果要将程序中的调用转移到,可以添加命令行定义,例如,所有源文件最终都会调用函数,而不是标准库函数。calloc()
-Dcalloc=my_calloc
上一个:从系统生成的线程调用 CRT
评论