使用函数指针,可以在C当中实现类似于C++的多态功能,但是如果使用不当会引入难以调试的bug:函数指针类型和函数类型不匹配。在现象上表现如下:一个参数在进入函数之前,其值是正确的,但是进入函数之后,它的值就变化了,而这时候根本没有对它进行任何操作!那么问题只能出现在参数传递上!如果你使用了函数指针来调用某个函数,那么问题极有可能是二者类型不匹配,这里给出一个实例:
#include <stdio.h>
#include <stdint.h>
typedef void (*funcptr) (int64_t a, int32_t b);
void foo(int32_t a, int32_t b)
{
printf ("a=%d/tb=%d/n",a,b);
}
int main( int argc, char *argv[] )
{
funcptr fp=(void*)foo; //<<--- 重点在这里,我们使用(void*)强制转换将编译器的警告滤掉了,而这就为我们已后引入了很难调试的bug。
(*fp)(-1,2);
return 0;
}
您可以想一下,这个程序的输出应该是多少?