gpt4 book ai didi

c - 覆盖 C 中的函数调用

转载 作者:太空狗 更新时间:2023-10-29 16:16:12 26 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/617554/

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