使用函數指針,可以在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;
}
您可以想一下,這個程序的輸出應該是多少?