如何为标准C库函数编写替换函数

时间:2018-03-04 16:49:18

标签: c

我有一个学校作业,要求更换C标准库中的标准内存分配函数。我不知道如何做到这一点,但这里是我的老师用来概述他的过程的简要描述。

  

接下来,我将#define标准C内存分配并免费   功能由他们的memcheck对应物替换。每个   在这种情况下,我正在查找该男子中参数的数量和名称   页面并在原始函数和它中使用它们   重新定义。另外,对于列出的参数   手册页,我也将(underscore, underscore)FILE(underscore, underscore) and LINE(underscore, underscore)传递给替代者   版本作为每个函数的最后两个参数。我是   注意不要在两个函数中包含一个分号   #define语句。

现在我正在处理头文件:

#ifndef MEMCHECK_H
#define MEMCHECK_H

#include<stdlib.h>

#define malloc _memcheck_malloc
#define free _memcheck_free

#endif

这个项目的目的是将标准的malloc和free函数替换为我们自己的函数,并在链表中使用。

最终我要求的是&#34;我如何开始定义我自己的将取代标准功能的功能?&#34;我需要使用#define方法以及上面提到的一些编译器marcos。

这是我发现的另一个问题的链接,似乎是正确的答案,但我不确定。 How to replace C standard library function ?(第3个回答)。

1 个答案:

答案 0 :(得分:2)

__FILE__宏扩展为包含当前源文件名称的const char*__LINE__宏扩展为int,它是宏所在的当前文件中的行号。因此,新功能的声明必须如下所示:

void *_memcheck_malloc(size_t size, const char *file, int line);

定义宏以将所有调用更改为malloc而不是调用_memcheck_malloc时,您必须定义宏将自动提供给其他函数的其他参数,因为任何现有的调用都是malloc不会包含它们。你想要这个

32    int *p = malloc(4 * sizeof(int));

改为:

32    int *p = _memcheck_malloc(4 * sizeof(int), "filename.c", 32);

因此,您的宏定义如下所示:

#define malloc(X) _memcheck_malloc((X), __FILE__, __LINE__)

X参数替换为原始文本中存在的任何参数;这是简单的模式匹配,因此原始文本中括号内的所有内容都将替换为宏调用中括号内的所有内容。围绕X参数(在替换文本中)的括号是为了确保提供给宏的任何表达式都被计算为单值

free()calloc()realloc()宏将遵循此模式。

CAVEAT 宏可能和地狱一样棘手,如果可能的话,应该避免使用宏。这种情况是少数广泛接受的宏替代用途之一。不要被这样的想法所吸引:“哇,宏很酷 - 我可以做各种各样的事情!”你可以,如果你这样做,你几乎总会后悔。