Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1013644
  • 博文数量: 128
  • 博客积分: 10012
  • 博客等级: 上将
  • 技术积分: 2050
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-15 17:49
文章分类

全部博文(128)

文章存档

2011年(16)

2009年(57)

2008年(55)

分类: C/C++

2008-11-20 15:36:57

事情的起因,开始于想使用回调函数。突然想说说什么叫经验,经验就是你遇到的和见到到多了,并有了自己的解决办法或思路,这种针对问题的妥善处理就叫经验了。o(∩_∩)o...,我可不是专家,更不是学者,下不了完美绕口的定义。这就叫自己的理论,废话不说了,还是继续此次的记录吧。最初在EVC使用让回调函数指针直接指向被调函数并编译时并没有发现问题,而是在VS中遇到了下面的错误提示:

  1. error C2440: '=' : cannot convert from 'void (__cdecl *)(CWnd *)' to '指针变量'

于是就引出了今天的话题,关于__cdecl和__stdcall。后来通过在被调函数前加上了__stdcall才算解决了,于是有了这样的话:在VS中默认是__cdecl的调用规范,而回调函数声明CALLBACK使用的是__stdcall调用规范。所以为了同一自己使用的调用规范,那么就需要在被调函数前加上__stdcall了。我想EVC默认的是使用__stdcall吧,或者可能编译器有个地方可以设定本工程使用的调用规范吧。没有细究,你来考究一下吧^_^。下面还是用两个文件来稍微说明来如何正确使用CALLBACK吧(注意,我下面列举的只是其中之一的方法哟)。

第一个文件:

  1. /*a.h 头文件 第一个文件的头文件,源文件*/ 
  2. typedef void (CALLBACK* EASTAR)(int len);  
  3. //EASTAR 就是回调函数的函数类型了,只有把该类型实例化之后才可用  
  4. //注意,被调函数要有同样的参数结构(CWnd*,int len)哟  
  5. //实例化该函数类型  
  6. public:  
  7.   EASTAR m_Eastar;  
  8. //到时就用m_Eastar指向一个函数就行了 呵呵  
  1. /*a.cpp源文件*/ 
  2. //调用该回调函数,就这样做:  
  3. int aclen =7; //这个参数只是做做样子啦  
  4. m_Eastar(aclen); 

第二个文件:

  1. /*b.h头文件*/ 
  2. A a; //第一个文件的实例,因为我要在源文件中引用第一个文件中的函数
  3. static void __stdcall OnFun(int len);   
  4. //这个OnFun就是被调用的函数,看到__stdcall如何加的了吧  
  5. //记得前面说的参数结构要保持一直哟 
  1. /*b.cpp源文件*/ 
  2. a.m_Eastar = OnFun;   
  3. //让回调函数指向本文件的函数OnFun(int len)  
  4.  
  5. void __stdcall B::OnFun(int len)  
  6. {  
  7.    // TODO: 在此处添加代码吧  

轮廓就是这个样子了。时间过的真快,记录点日志也挺花费功夫的嘛 ^_^

阅读(5000) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~