免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7619 | 回复: 14

[函数] 函数指针变量的类型转换 [复制链接]

论坛徽章:
0
发表于 2004-01-07 18:14 |显示全部楼层
我们在写程序的过程中,不免会遇到函数指针变量类型的转换。



  1. #define __cdecl

  2. {
  3.    int* (*pf2)(int*);                         //定义一个函数指针变量
  4.    void *block;                             
  5.    block = (void *)FunctionPoint;    //把FunctionPoint函数的地址赋给block
  6.    pf2 = (int *(__cdecl *)(int *))block; //把void *型转换为原来类型
  7. }

复制代码


希望能给这方面不熟的大侠一个启发。

论坛徽章:
0
发表于 2004-01-07 19:00 |显示全部楼层

函数指针变量的类型转换

这样操作安全吗?

论坛徽章:
0
发表于 2004-01-07 20:58 |显示全部楼层

函数指针变量的类型转换

太牛了,偶看不懂啊,偶太菜了

论坛徽章:
0
发表于 2004-01-07 22:23 |显示全部楼层

函数指针变量的类型转换

[quote]原帖由 "seaglexiao"]这样操作安全吗?[/quote 发表:


偶不懂。

只知道指针的类型在指针移动时有不同
如:char *p 与 double *P 两种类型在执行像p++的操作时加的值是不同的。

像上述的指针类型的多次转换应该对指向的内容没什么影响吧?
明天看各位大侠的见解。

论坛徽章:
0
发表于 2004-01-07 23:44 |显示全部楼层

函数指针变量的类型转换

原帖由 "lylzp" 发表:

希望能给这方面不熟的大侠一个启发。

  1. #define __cdecl

  2. {
  3.    int* (*pf2)(int*);                         //定义一个函数指针变量
  4.    void *block;                             
  5.    block = (void *)FunctionPoint;    //把FunctionPoint函数的地址赋给block
  6.    pf2 = (int *(__cdecl *)(int *))block; //把void *型转换为原来类型
  7. }
复制代码


我不是大侠,对这些东西恰好略知一二,看了你的贴子后大惑不解:

1. __cdecl 是 c 的默认函数调用方式,为何要转换成这种形式?除非你在编译的时候指定了不同的调用方式,而你想覆盖它。
2. #define __cdecl 把 __cdecl 重定义为 "空",或者这正是你的意图,但 why?
3. pf2 的类型在你声明
   int* (*pf2)(int*);
的时候,就定下来了。你不可能在以后进行改动的。即使
pf2 = (int *(__cdecl *)(int *))block;
但pf2还是原来的类型,在进行调用的时候,也不会有所不同。


我在实践中没遇到过你说的情况,所以很不理解,请举一个具体点的例子,让我理解你的意图。ok?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2004-01-08 09:18 |显示全部楼层

函数指针变量的类型转换

楼主牛人。
受益匪浅。

论坛徽章:
0
发表于 2004-01-08 09:25 |显示全部楼层

函数指针变量的类型转换

原帖由 "win_hate" 发表:

我不是大侠,对这些东西恰好略知一二,看了你的贴子后大惑不解:

1. __cdecl 是 c 的默认函数调用方式,为何要转换成这种形式?除非你在编译的时候指定了不同的调用方式,而你想覆盖它。
2. #define __cdecl ?.........


1.__cdecl是是 c 的默认函数调用方式,而我这个是在solaris下forte c没有,所以我定义了一个。也可以不用它:

  1.    pf2 = (int *(*)(int *))alter[i].pfun;
复制代码


2.那个代码只是示范,block是在其它地方被赋值的,我的表达能力并不好请看我的范例:


  1. .h

  2. typedef struct alter_fun
  3. {
  4.     void *pfun;/*载入函数*/
  5.     int   nfuntype;
  6. }ALTER_FUN;

  7. int    *FunctionPoint1(int *ival);
  8. void  FunctionPoint2();

  9. .c

  10. ALTER_FUN alter[] =
  11. {
  12.         {FunctionPoint,1},
  13.         {FunctionPoint2,2},
  14.         {NULL,0}
  15. };

  16. {
  17.    i = 0;
  18.    while(alter[i].pfun)
  19.    {
  20.       switch(alter[i].nfuntype)
  21.       {
  22.        case 1:
  23.             //用类型1函数指针来转换alter[i].pfun,并执行
  24.        break;
  25.        case 2:
  26.            //用类型2函数指针来转换alter[i].pfun,并执行
  27.        break;
  28.            .
  29.            .
  30.            .
  31.        }
  32.        i ++;
  33.    }
  34. }

复制代码

论坛徽章:
0
发表于 2004-01-08 10:47 |显示全部楼层

函数指针变量的类型转换

楼主牛呀!
去看看MFC对ON_COMMAND_XXX的做法吧。

论坛徽章:
0
发表于 2004-01-08 11:28 |显示全部楼层

函数指针变量的类型转换

原帖由 "stonemason" 发表:
楼主牛呀!
去看看MFC对ON_COMMAND_XXX的做法吧。


哈哈!!!

别笑我了,这也是我的一个朋友问我的。

我的理论并不丰富,但我知道这样是可以实现的,所以我就把它写出来,有不对的地方还请各位大侠见谅!!!

论坛徽章:
0
发表于 2004-01-08 16:00 |显示全部楼层

函数指针变量的类型转换

开开玩笑,MFC的做法是把函数指针声明为一个union,管他什么类型的函数指针都可以用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP