【问题标题】:How write a replacement function for a standard C library function如何为标准 C 库函数编写替换函数
【发布时间】:2018-08-12 08:40:59
【问题描述】:

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

接下来,我要#define标准的C内存分配和释放 函数将由其 memcheck 对应项替换。每个 案例,我正在查找 man 中参数的数量和名称 页面并在原始功能及其中使用它们 重新定义。此外,对于列出的论点 手册页,我也将(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 方法以及上面提到的一些编译器宏。

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

【问题讨论】:

  • 如果您认为它拥有答案 - 为什么还要为此写另一个 Q 呢?如果您不这么认为,请解释为什么不这么认为。
  • @PatrickArtner 我不知道这个答案是否正确,而且在谷歌上很难找到一个直截了当的答案。我不确定它是否正确,仅仅是因为我不完全理解如何使用#define 来替换标准函数。
  • #define 不会更改库,但会将对标准函数的任何 调用 修改为调用您的函数。预处理器将free(ptr) 替换为_memcheck_free(ptr),编译器甚至不知道它这样做了。
  • @BoPersson 因此,每次调用 malloc 时,#define 的第一个参数是“malloc”,第二个参数是“我正在替换 malloc 的函数的名称”,它将使用我的替换功能?所以我现在需要做的就是在我的头文件中为替换函数声明一个原型,然后创建一个函数文件来保存我的替换文件的定义。对吗?

标签: c


【解决方案1】:

__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 宏可能非常棘手,总的来说,应该尽可能避免。这种情况是宏替换的少数广泛接受用途之一。不要沉迷于“哇,宏很酷——我可以用它做各种事情!”的想法。你可以,如果你这样做了,你几乎总是会后悔的。

【讨论】:

  • 正是我想要的,这将非常有帮助!
猜你喜欢
  • 2012-02-24
  • 2017-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多