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

How to undef calloc() function from stdlib to use our own function

提问人:Himanshu 提问时间:9/12/2023 最后编辑:chqrlieHimanshu 更新时间:9/13/2023 访问量:37

问:

我有一个头文件 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 多定义错误

评论

1赞 273K 9/12/2023
您可以获得“calloc”的多个定义,因为您在头文件中定义了它。
0赞 Andrew Henle 9/13/2023
我有一个头文件 calloc.h,我在其中使用 stdlib 的 malloc() 函数定义了 calloc() 函数。首先,为什么?其次,如果你在 Linux 或任何其他 POSIX 系统上运行,你就会调用未定义的行为:“如果包含标头,则标头部分中描述的每个具有外部链接的标识符都将保留用作具有外部链接的标识符。
0赞 Lundin 9/13/2023
你最大的问题是你正在用C++编译器编译C。如果你甚至不知道你使用的是什么编译器,那么就没有希望产生一个可靠且有效的程序。

答:

0赞 chqrlie 9/13/2023 #1

您得到的链接时间错误似乎表明 C 库中定义的模块已链接到您的程序中,不是因为您重新定义了 ,而是因为您至少使用了在同一模块中定义的另一个符号。两者可能在 C 库的同一模块中定义,这意味着您不能通过调用 来重新定义。calloc()calloccallocmalloccalloc()malloc()

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

在系统上,您可能必须重新定义 、 、 以及可能的其他库函数(如 ,),因此不会将任何原始分配模块提取到可执行文件中。这是一项艰巨的任务。malloc()calloc()realloc()free()strdup()aligned_alloc()

如果要将程序中的调用转移到,可以添加命令行定义,例如,所有源文件最终都会调用函数,而不是标准库函数。calloc()-Dcalloc=my_calloc