我需要重新编码free()
func用于教育目的,它也必须命名为free()
。
当我重命名我的函数myfree()
时,它可以完美地工作,但当我命名为free()
时,程序不知道他是否需要使用我的或系统,所以程序只是Segmentation fault(core dumped)
即使我不打电话给我自由(只是另一个free()
func的声明似乎崩溃了)
那么如何告诉编译器使用我的而不是系统?
提前感谢你。
编辑:Linux操作系统
答案 0 :(得分:6)
基本上,我可以看到三个选项
#define
作为@Mohamed建议。答案 1 :(得分:6)
如果您正在使用GCC,则可以使用编译器来帮助您。编译时,请在链接行中添加:-Xlinker --wrap=free
。这会将所有对free()
的调用重定向为使用您必须提供的__wrap_free()
。如果您想调用原始free()
函数,它仍然存在,但已重命名;你可以致电__real_free()
。
这将捕获您链接的预编译库,宏无法做到(但LD_PRELOAD可以)。
答案 2 :(得分:1)
使用宏:强制程序使用您的myfree()
函数:
#define free(X) myfree(X)
答案 3 :(得分:1)
最简单(不是最安全)的方式是#define free myfree
,因此预处理器会将所有来自 free()的调用替换为 myfree()。另一种更安全的方法是创建一个名为 free()的普通函数,并且不包含库,它们还包含 free()函数。
答案 4 :(得分:1)
如果您正在寻找标准方式,我担心它不存在。重新定义标准库名称是未定义的行为。
C11,7.1.3.2:
...如果程序声明或定义了一个标识符 保留的上下文(7.1.4允许的除外),或定义保留的上下文 标识符作为宏名称,行为未定义。
在7.1.4中,有一个很长的解释,说明库如何定义一个与函数同名的宏以及如何绕过该宏。没有迹象表明用户如何覆盖标准库函数。
您还可以查看this question了解详情。
非标准方式当然总是可以的,你可以在其他答案中找到。