如何从 stdlib 取消定义 calloc() 函数以使用我们自己的函数

问题描述 投票:0回答:1

我有一个头文件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 malloc calloc crt multiple-definition-error
1个回答
0
投票

您得到的链接时间错误似乎表明 C 库中定义

calloc()
的模块已链接到您的程序中,不是因为您重新定义了
calloc
,而是因为您至少使用了同一模块中定义的另一个符号。
calloc
malloc
可能都在 C 库的同一模块中定义,这意味着您无法通过调用
calloc()
来重新定义
malloc()

另请注意,您似乎正在将 C 源文件编译为 C++。

在您的系统上,您可能必须重新定义

malloc()
calloc()
realloc()
free()
以及可能的其他库函数,例如
strdup()
aligned_alloc()
,因此不会拉取任何原始分配模块到你的可执行文件中。这是一项不平凡的任务。

如果您想在程序中将调用转移到

calloc()
,您可以添加命令行定义,例如
-Dcalloc=my_calloc
,这样所有源文件最终都会调用您的函数而不是标准库函数。

© www.soinside.com 2019 - 2024. All rights reserved.