在许多脚本语言中,我们都有这样的编程方法:
首先,有一个名为func:的函数
void func()
{
}
其次,我想在客户端调用此函数时记录一些信息,但我不想修改函数,这样我就可以做一些类似的事情:
void (*pfunc)(void) = func;
void func()
{
log("Someone call fund");
pfunc();
}
之后,任何调用fund的人都会调用我的"override"函数。这在许多脚本语言中都可以。我能用C语言做同样的事情吗?如何对其进行编码?
我想用这个方法在一些第三方库中做一些工作,所以我必须做一些影响链接过程的事情,而不仅仅是编译过程。
您可以用宏对其进行编码,在您的简单情况下是
#define func()
do {
log("Someone called func");
func();
} while(0)
在宏的展开中,宏不是递归展开的。
对于更复杂的情况,您可以实现一个函数和一个宏。在一个".h"文件中,你会放:
void func_annotated(void);
#ifdef DEBUG
# define func() func_annotated()
// or if the function takes parameters
// # define func(...) func_annotated(__VA_ARGS__)
#endif
在".c"文件中,然后将实现
void func_annotated(void)
{
log("Someone called func");
(func)();
}
在这里,func
周围的额外()
确保它总是使用实函数。
也许您正在寻找一个库插入器。您可以在文件中定义自己的函数,并使用这些函数而不是系统调用来调用要记录调用的程序。
例如,插入ls
:进行的一些系统调用
$ LD_PRELOAD=/your/own/functions/file.so ls -l
它更适合于无法更改调用要记录的函数的程序代码(可能是因为它不可用)的情况。
在这种情况下不需要使用函数指针。您可以让函数func
为您想要记录的任何内容获取参数。重写也是如此,它不需要是函数指针(除非您计划稍后更改重写函数)。此外,在这种情况下,它将创建一个无限循环,因为函数指针指向func
函数。此外,我甚至不确定在声明函数之前是否允许使用func
作为函数指针。
我会尝试这样的方法,这会记录一个整数,但你可以用它来记录你想要的任何东西。
void func(int value)
{
printf("%dn", value);
anotherFunc(value);
}
其中CCD_ 7是完全不同的函数。就像我前面说的,如果你想更改anotherFunc()
调用的函数,那么使用函数指针是有意义的,否则就不需要了。