我有一个头文件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'
您得到的链接时间错误似乎表明 C 库中定义
calloc()
的模块已链接到您的程序中,不是因为您重新定义了 calloc
,而是因为您至少使用了同一模块中定义的另一个符号。 calloc
和 malloc
可能都在 C 库的同一模块中定义,这意味着您无法通过调用 calloc()
来重新定义 malloc()
。
另请注意,您似乎正在将 C 源文件编译为 C++。
在您的系统上,您可能必须重新定义
malloc()
、calloc()
、realloc()
、free()
以及可能的其他库函数,例如 strdup()
、aligned_alloc()
,因此不会拉取任何原始分配模块到你的可执行文件中。这是一项不平凡的任务。
如果您想在程序中将调用转移到
calloc()
,您可以添加命令行定义,例如-Dcalloc=my_calloc
,这样所有源文件最终都会调用您的函数而不是标准库函数。