出于教育目的,我需要重新编码free()
函数,它也必须命名为free()
。
当我将函数重命名为myfree()
时,它可以完美地工作,但当我将其命名为free()
时,程序不知道他是否需要使用我的函数或系统的函数,所以即使我不调用free,程序也只有Segmentation fault(core dumped)
(只是另一个free()
函数的声明似乎会使其崩溃)
那么,我如何告诉编译器使用我的而不是系统的呢?
提前谢谢你。
编辑:Linux操作系统
基本上,你有三个选项,我可以看到
- 在编译时重定向它,例如使用@Mohamed建议的
#define
- 在运行时使用LD_PRELOAD更改它
- 使用malloc钩子修改现有的malloc/free
如果您正在使用GCC,您可以使用编译器来帮助您。编译时,请将其包含在链接行-Xlinker --wrap=free
中。这将把所有调用重定向到free()
,以使用必须提供的__wrap_free()
。如果您想调用原始的free()
函数,它仍然存在,但已重命名;您可以拨打__real_free()
。
这将捕获链接所针对的预编译库,这是宏无法做到的(但LD_PRELOAD可以做到)。
使用宏:强制程序使用myfree()
函数:
#define free(X) myfree(X)
最简单(不是最安全)的方法是#define free myfree
,因此预处理器将替换从free()到myfree(。另一种更安全的方法是创建一个名为free()的普通函数,并且不包括库,这些库也包含free()函数。
如果您正在寻找一种标准的方法,恐怕它并不存在。重新定义标准库名称是未定义的行为。
C11,7.1.3.2:
如果程序在保留它的上下文(7.1.4允许的除外),或定义保留标识符作为宏名称,行为是未定义的。
在7.1.4中,对库如何定义与函数同名的宏以及如何绕过该宏进行了详细解释。没有指示用户可以如何覆盖标准库函数。
您也可以查看此问题以获取更多信息。
当然,非标准的方法总是可能的,正如你在其他答案中所能找到的那样。