2005和6.0

Microsoft777 2008-10-31 09:49:45
今天运行了一下以前做的五子棋的程序,以前是用6.0编译的,但是放在2005下。编译却通不过,提示错误为 error C2440: “static_cast”: 无法从“void (__thiscall CFiveChessDlg::* )(CPaintDC &)”转换为“AFX_PMSG”。

错误发生在 ON_BN_CLICKED(IDC_RESTART, OnRestart) 这个宏,它是点击按钮的一个响应事件。它定义为
#define ON_BN_CLICKED(id, memberFxn) \
ON_CONTROL(BN_CLICKED, id, memberFxn)。

ON_CONTROL(BN_CLICKED, id, memberFxn) 又是一个宏定义,它的定义为
#define ON_CONTROL(wNotifyCode, id, memberFxn) \
{ WM_COMMAND, (WORD)wNotifyCode, (WORD)id, (WORD)id, AfxSigCmd_v, \
(static_cast< AFX_PMSG > (memberFxn)) },

OnRestart 这个函数声明为afx_msg void OnRestart(CPaintDC &dc),它是通过BEGIN_MESSAGE_MAP把消息添加到消息映射表。

我猜想发生此事的原因是,AFX_PMSG 定义为
typedef void (AFX_MSG_CALL CCmdTarget::*AFX_PMSG)(void); 它是一个无参的函数。然而我们的OnRestart是一个有一个参数的函数,所以2005在编译的时候进行参数匹配的时候发现了程序的不正确,所以报错了。

那么6.0为什么没有报错呢?我猜想是因为,它对于宏没有那么高的安全识别。我自身是没有参数的,但是你给我传进入一个参数,我只是不用就OK了,不会影响到到程序运行的正确性。然而,我感觉还是2005的做法是正确的,因为咱们现在是多传参数。如果少传参数而不报错的话,那么想找出这个bug,那就劳民伤财了。

这个问题的解决办法,就是把参数去掉。
...全文
53 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
backway 2008-10-31
  • 打赏
  • 举报
回复
自问自答?
backway 2008-10-31
  • 打赏
  • 举报
回复
????
帅得不敢出门 2008-10-31
  • 打赏
  • 举报
回复
up
Microsoft777 2008-10-31
  • 打赏
  • 举报
回复
好! 这个问题解决了,但是在运行的时候的又出现了一个错误。错误的提示为:


他奶奶的,计算机是洋鬼子发明的,英语不好确实是一件麻烦的事情。上面提示的错误,大概意思是说 szBuf 这个变量产生冲突了。好,我们到 szBuf 定义处看看!char szBuf[2]; itoa(nTime, szBuf, 10);
它是一个字符数组,发生问题的地方就是在 itoa 这个函数里。因为我们定义数组的大小是2个,但是当传进两个字符的时候却找不到结束的标志。所以2005不像6.0那么仁慈,毫不留情的把程序做掉。狠吧!狠就对了,如果真的出现问题的时候找出问题的根源是操蛋的一件事情。
解决办法,可以扩大数组。记得在 kingsoft 的时候,老大告诉我们要把临时数组定义的比实际需要大一些。起初还和他争执浪费空间,其实那点空间算个屁啊!而且,按照内存对其技术,还会按照定义的尺寸进行调整放大的。

64,661

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧