2

我需要重新编码free()func 以用于教育目的,它也必须命名free()

当我重命名我的函数myfree()时,它可以完美地工作,但是当我命名它时free(),程序不知道他是否需要使用我的或系统的所以Segmentation fault(core dumped)即使我不调用我的免费程序(只是另一个free()函数的声明似乎崩溃它)

那么我怎样才能告诉编译器使用我的而不是系统的呢?

提前谢谢你。

编辑:Linux操作系统

4

5 回答 5

6

基本上,我可以看到三个选项

于 2013-02-06T11:28:42.487 回答
6

如果您使用的是 GCC,则可以使用编译器来帮助您。编译时,将其包含在链接行中:-Xlinker --wrap=free. 这会将所有调用重定向到free()__wrap_free()必须提供的使用。如果您想调用原始free()函数,它仍然存在但已重命名;你可以打电话__real_free()

这将捕获您链接的预编译库,这是宏无法做到的(但 LD_PRELOAD 可以)。

于 2013-02-06T11:35:35.550 回答
1

为此使用宏:强制程序使用您的myfree()功能:

#define free(X) myfree(X)
于 2013-02-06T11:23:08.460 回答
1

最简单(不是最安全)的方法是#define free myfree这样预处理器将替换从free()myfree()的所有调用。另一种更安全的方法是创建一个名为free()的普通函数,并且不包含也包含free()函数的库。

于 2013-02-06T11:28:04.107 回答
1

如果您正在寻找一种标准的方式,恐怕它不存在。重新定义标准库名称是未定义的行为。

C11,7.1.3.2:

...如果程序在保留标识符的上下文中声明或定义标识符(7.1.4 允许的除外),或将保留标识符定义为宏名称,则行为未定义。

在 7.1.4 中,有很长的解释库如何定义与函数同名的宏以及如何绕过该宏。没有迹象表明用户可以如何覆盖标准库函数。

您还可以查看此问题以获取更多信息。

您可以在其他答案中找到非标准方法当然总是可能的。

于 2013-02-06T11:34:09.003 回答