函数指针

    函数指针是指向一个地址的指针,函数位于text segment。如何使用函数,有两种方法,第一种是通过函数名称去引用,编译器在转化为汇编代码过程中会把函数名称作为代码的label,通过label的引用,linking时候转化为具体引用地址。也可以在C代码中通过函数指针引用函数,即直接使用函数的地址来调用函数,函数指针在调用函数时为乐增强函数的可读性,要求把函数的参数类型和返回类型标记全面。

举个例子:

定义foo函数如下:


因为my_int_func的函数类型是不返回(void)并且接受int类型的参数(intX),所以它的指针声明就要写清楚这个类型是void(*)(int),指针的变量名放在*后面,这样编译器在编译的时候才能通过。

那么现在可以使用foo变量调用这个函数:







函数指针……

04-09

在MFC里有这么一句rnreturn ((* _messageEntries [i] .pfn)(hwnd, message, wParam, lParam));rn是表示调用函数返回一个指针……rn然后用*对指针取值吗?!rn然后再returnrn原形定义是 LONG (*pfn)(HWND, UINT, WPARAM, LPARAM);rn在struct MSGMAP_ENTRIES里rnrnrn部分原形rn=====================分割线==========================================rnWindows程序的本质就是Message based,Event driven。rnMessage的结构:rn/*Queued message structure */rntypedef struct tagMSGrnrn HWND hwnd;rn UINT message; // WM_XXXrn WPARAM wParam;rn LPARAM lParam;rn DWORD time;rn POINT pt;rnMSG;rnrnrn消息映射rn首先定义一个MSGMAP_ENTRIES结构和dim宏rnstruct MSGMAP_ENTRIESrnrn UINT nMessage;rn LONG (*pfn)(HWND, UINT, WPARAM, LPARAM); rnrn;rn#define dim(x) (sizeof (x) / sizeof (x[0]))rnrn接下来,定义两个数组_messageEntries[] 和_commandEntries[],把程序中要处理的消息集rnrn消息处理常量的关联性建立起来。rn//消息处理常量对照表rnrnstruct MSGMAP_ENTRY -messageEntries [] =rnrn WM_CRATE, OnCreate,rn WM_PAINT, OnPaint,rn WM_SIZE, OnSize,rn WM_COMMAND, OnCommand,rn WM_SETFOCUS, OnSetFocus,rn WM_CLOSE, OnClose,rn WM_DESTROY, OnDestroy,rn;rnrnstruct MSG_ENTRY _commandEntries [] =rnrn IDM_ABOUT, OnAbout,rn IDM_FILEOPEN, OnFileOpen,rn IDM_SAVRAS, OnSaveAs,rn;rnrn因此,窗口函数可以设计成:rnLRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM rnrnlParam)rnrn int i;rn for (i = 0; i < dim (_messageEntries); i ++)rn rn if (message == _messageEntries [i] .nMessage)rn return ((* _messageEntries [i] .pfn)(hwnd, message, wParam,lParam));rn rn return (DefWindowProc (hwnd, message, wParam, lParam));rn

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试