我需要重新编码free()
func 以用于教育目的,它也必须命名free()
。
当我重命名我的函数myfree()
时,它可以完美地工作,但是当我命名它时free()
,程序不知道他是否需要使用我的或系统的所以Segmentation fault(core dumped)
即使我不调用我的免费程序(只是另一个free()
函数的声明似乎崩溃它)
那么我怎样才能告诉编译器使用我的而不是系统的呢?
提前谢谢你。
编辑:Linux操作系统
基本上,我可以看到三个选项
#define
@Mohamed 建议的那样。如果您使用的是 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 中,有很长的解释库如何定义与函数同名的宏以及如何绕过该宏。没有迹象表明用户可以如何覆盖标准库函数。
您还可以查看此问题以获取更多信息。
您可以在其他答案中找到非标准方法当然总是可能的。