首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

指向函数的指针解决方案

2012-03-23 
指向函数的指针我一直认为指向函数的指针,它的类型要和被指的函数一致,如,intfunc(inta,char*s){...}intma

指向函数的指针
我一直认为指向函数的指针,它的类型要和被指的函数一致,如,
int   func(int   a,   char   *s)
{
        ...
}

int   main(void)
{
        int   (*funcptr)(int,   char*);

        fucnptr(1,   "hello ");
}

但我发现不指定函数指针定义时的参数,便可指向任一参数的函数,
#include   <stdio.h>

int   funcA(int   n)
{
printf( "funcA   %d\n ",   n);

return   0;
}

int   funcB(int   x,   int   y)
{
printf( "funcB   %d,   %d\n ",   x,   y);

return   0;
}

int   funcC(char   *s1,   char   *s2)
{
printf( "funcC   %s,   %s\n ",   s1,   s2);

return   0;
}


int   main(void)
{
int     (*p)();

p   =   funcA;
(*p)(1);

p   =   funcB;
(*p)(2,   3);

p   =   funcC;
(*p)( "ni ",   "12345 ");

return   0;
}

这个我在VC6.0和linux(F5)下都试过,可以编译、运行。

另外,
        p   =   funcC;
        (*p)( "ni ",   234567);假设数字234567是 "123456 "的地址。
也行。

不知道这会不会有什么问题?

[解决办法]
很老的 K&R C 语言中是不带参数表示省略了参数,可以按任意参数来用。
[解决办法]
C允许这样做,但C++不允许的。
这种情况容易出错。因为都是cdecl调用方式,所以调用者知道参数个数,所以正确恢复栈
但函数本身不知道
#include <stdio.h>

int funcA(int n)
{
printf( "funcA %d\n ", n);

return 0;
}
int main(void)
{
funcA(1,2,3,4,5,6,7,8,9,0);这样也可以编译过去正常运行
}
[解决办法]
系统调用函数指针只是一个call指令C淡化了压栈的高要求,而C++不行,要求严格的平衡堆栈,这也是为什么...省略参数符号收到那么多批评~
C只是相信你能合理压入参数
而C++要求编译器编译阶段就检查~尽一切可能保证如此危险的函数指针的安全性~
[解决办法]
是这样的, 对于这个的讨论以前很激烈的.
这一点来说,c++的要求很安全.

热点排行