我有一个学校作业,要求更换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函数替换为我们自己的函数,并在链表中使用。
最终我要求的是“我如何开始定义我自己的功能,取代标准功能?”我需要使用#define方法以及上面提到的一些编译器marcos。
这是我发现的另一个问题的链接似乎是正确的答案,但我不确定。 How to replace C standard library function ?(第3个答案)。
__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宏可能和地狱一样棘手,如果可能的话,应该避免使用。这种情况是少数被广泛接受的宏观替代用途之一。不要被这样的想法所吸引:“哇,宏很酷 - 我可以做各种各样的事情!”你可以,如果你这样做,你几乎总会后悔。