gpt4 book ai didi

c - 重写 C 中的函数调用

转载 作者:行者123 更新时间:2023-11-30 16:43:14 24 4
gpt4 key购买 nike

为了记录调用,我想覆盖对各种 API 的某些函数调用,但我也可能想在数据发送到实际函数之前对其进行操作。

例如,假设我在源代码中使用了名为 getObjectName 的函数数千次。有时我想暂时重写这个函数,因为我想改变这个函数的行为以查看不同的结果。

我创建一个新的源文件,如下所示:

#include <apiheader.h>    

const char *getObjectName (object *anObject)
{
if (anObject == NULL)
return "(null)";
else
return "name should be here";
}

我像平常一样编译所有其他源代码,但在链接到 API 库之前,我首先将其链接到此函数。这工作得很好,只是我显然无法在我的重写函数中调用真正的函数。

是否有一种更简单的方法可以“覆盖”函数而不会出现链接/编译错误/警告?理想情况下,我希望能够通过编译和链接一个或两个额外的文件来覆盖该函数,而不是摆弄链接选项或更改程序的实际源代码。

最佳答案

使用 gcc,在 Linux 下您可以使用 --wrap 链接器标志,如下所示:

gcc program.c -Wl,-wrap,getObjectName -o program

并将您的函数定义为:

const char *__wrap_getObjectName (object *anObject)
{
if (anObject == NULL)
return "(null)";
else
return __real_getObjectName( anObject ); // call the real function
}

这将确保对 getObjectName() 的所有调用都重新路由到您的包装函数(在链接时)。然而,Mac OS X 下的 gcc 中缺少这个非常有用的标志。

如果您使用 g++ 进行编译,请记住使用 extern "C" 声明包装函数。

关于c - 重写 C 中的函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45441222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com