我有一个C库源代码及其配置文件,我可以随时重建它。有一个库函数foo()由于它的不当行为我想替换它。我不应该编辑库源,只能修改配置文件。有没有办法如何用这个限制替换从foo()到bar()的所有调用?
我尝试使用宏定义:
#define foo bar
但这并没有帮助,因为它也取代了函数名称(声明和定义)。
我找到了一个类似的帖子:C++ Replacing Functions with Macros。问题是我无法修改源代码,也没有条件代码。有什么建议吗?
编辑:澄清问题的简单示例。假设库有一个实用函数plus()
用于求和两个整数,函数minus()
用于减去两个整数,内部调用plus(a,-b)
。但由于函数plus()
没有计算出正确的结果,我写了一个函数myplus()
,效果很好。现在问题是如何强制库调用myplus()
而不是plus()
。
答案 0 :(得分:0)
在源代码中添加foo
的实施。在该功能中,请致电bar
。链接器应该在库中的版本之前选择foo
版本。
答案 1 :(得分:0)
#include "foolib.h"
#define foo bar
void bar()
{
//foo() replaced with bar()
}
只要你的#define语句出现在#include之后,它就不会重命名库中的函数定义。这项技术一直在使用。
答案 2 :(得分:0)
假设foo()驻留在foo.c中,您可以执行以下操作:
不要将foo.c添加到项目中,而是添加foowrap.c,它将是:
#define __FOOWRAP__
#include "foo.c"
在您执行原始#define的标题中,请改为:
#ifndef __FOOWRAP__
#define foo bar
#endif
这也假设foo()不在foo.c本身内部调用。如果是,我认为没有更改源文件就无法解决问题。