一段看不太懂的宏定义!~

kbsoft 2007-10-25 01:54:13
class __declspec(novtable) CIOMessageMap
{
public:
virtual bool ProcessIOMessage(IOType clientIO, ClientContext* pContext, DWORD dwSize) = 0;
};

#define BEGIN_IO_MSG_MAP() \
public: \
bool ProcessIOMessage(IOType clientIO, ClientContext* pContext, DWORD dwSize = 0) \
{ \
bool bRet = false;

#define IO_MESSAGE_HANDLER(msg, func) \
if (msg == clientIO) \
bRet = func(pContext, dwSize);

#define END_IO_MSG_MAP() \
return bRet; \
}


谁能给详细的讲讲这段代码啊???这个宏定义,只要调用ProcessIOMessage,都会触发吗?
...全文
140 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjkgz 2007-10-25
  • 打赏
  • 举报
回复
novtable就是说不产生虚函数表。
一般的如果能肯定这个类不是继承关系中的最低层的话可以这么用,也算是强制这个类必须被继承。
在COM中定义的对象,经常加上这个限制。
wjkgz 2007-10-25
  • 打赏
  • 举报
回复
不是内联的,不是写在h文件里面就是内联的,
内联的一般是那种直接的返回的才算,
像这样复杂的,还要调用其它的函数的,都不做内联函数来处理的。
kbsoft 2007-10-25
  • 打赏
  • 举报
回复
别走,哥们,最后一个问题,类声明后,__declspec(novtable)加上这个,调用时有什么好处呢?就是减少虚函数表的容量?
guo_wei 2007-10-25
  • 打赏
  • 举报
回复
哦,对了,呵呵,你说的对,是内联的,糊涂了
kbsoft 2007-10-25
  • 打赏
  • 举报
回复
在类的头文件中,宏展开以后,不就是inline么,呵呵
guo_wei 2007-10-25
  • 打赏
  • 举报
回复
1、当然是调用这个函数的人传的了
2、不是inline函数
#define BEGIN_IO_MSG_MAP() \
public: \
inline bool ProcessIOMessage(IOType clientIO, ClientContext* pContext, DWORD dwSize = 0) \
{ \
bool bRet = false;

这样才是inline函数

而且你理解的还有问题,不是说参数如何传递给宏,宏只是写代码的时候的一种写法,在执行上不存在参数传递给宏这一说,你的意思应该是参数如何传递给ProcessIOMessage这个函数,那当然谁调用谁传了,系统会调用,你自己也可以调用
ouyh12345 2007-10-25
  • 打赏
  • 举报
回复
ProcessIOMessage是虚函数,由基类调用子类。

当有io消息时,先调用父类的ProcessIOMessage函数,
然后IOType clientIO, ClientContext* pContext, DWORD dwSize这些参数就有了
JonathanS666 2007-10-25
  • 打赏
  • 举报
回复
类似MFC宏,组合定义
kbsoft 2007-10-25
  • 打赏
  • 举报
回复
如果类的定义(.h)时这么出现,就相当于一个inline函数了?
kbsoft 2007-10-25
  • 打赏
  • 举报
回复
可是,函数的参数:IOType clientIO, ClientContext* pContext, DWORD dwSize = 0
是如何传递给宏的?
tfq2002 2007-10-25
  • 打赏
  • 举报
回复
就是
BEGIN_IO_MSG_MAP() 代表
public:
bool ProcessIOMessage(IOType clientIO, ClientContext* pContext, DWORD dwSize = 0)
{
bool bRet = false;

IO_MESSAGE_HANDLER(msg, func) 代表
if (msg == clientIO)
bRet = func(pContext, dwSize);

END_IO_MSG_MAP() 代表
return bRet;
}

三个宏就是一个函数的定义
guo_wei 2007-10-25
  • 打赏
  • 举报
回复
不是调用会触发,而是把这些宏转化成定义的代码写到程序里。
BEGIN_IO_MSG_MAP()和END_IO_MSG_MAP()要成对出现,因为只出现一个的话构不成完整代码,IO_MESSAGE_HANDLER(msg, func)要出现在这两个中间。

例如
BEGIN_IO_MSG_MAP()
IO_MESSAGE_HANDLER(ID_MY_MSG, OnMyMsg)
END_IO_MSG_MAP()


被解释成下面的代码替换这段代码
public: 
bool ProcessIOMessage(IOType clientIO, ClientContext* pContext, DWORD dwSize = 0) \
{
bool bRet = false;

if (ID_MY_MSG == clientIO)
bRet = OnMyMsg(pContext, dwSize);

return bRet;
}


从代码结果来看,显然这些宏应该用在类的定义部分。
ouyh12345 2007-10-25
  • 打赏
  • 举报
回复
即,注册了某个函数响应某个消息
yxz_lp 2007-10-25
  • 打赏
  • 举报
回复
调用的时候这样:
BEGIN_IO_MSG_MAP()
IO_MESSAGE_HANDLER(msg, func)
END_IO_MSG_MAP()
展开后就是:

public:
bool ProcessIOMessage(IOType clientIO, ClientContext* pContext, DWORD dwSize = 0) \
{
bool bRet = false;


if (msg == clientIO) \
bRet = func(pContext, dwSize);


return bRet;
}

也就是一个函数,IO_MESSAGE_HANDLER()用来添加消息响应函数来处理消息。



ouyh12345 2007-10-25
  • 打赏
  • 举报
回复
BEGIN_IO_MSG_MAP()
IO_MESSAGE_HANDLER(msg, func)
END_IO_MSG_MAP()
三个宏组合起来,成为一个函数定义。
基本上是这样用的:
BEGIN_IO_MSG_MAP()
IO_MESSAGE_HANDLER(WM_MSG1, OnMsg1)
IO_MESSAGE_HANDLER(WM_MSG2, OnMsg2)
IO_MESSAGE_HANDLER(WM_MSG3, OnMsg3)
....
END_IO_MSG_MAP()

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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