大家看看这是用宏定义结构体吗?该怎么理解,高分

yuwenying1985 2010-10-26 04:55:29

#define VOS_MSG_HEADER int usSendSeqNum; \
int usAckNum; \
int ucIpcMsgType; \
int ucFragFlg; \
int ucReserved; \
int ucPrio; \
int ulSenderCpuId; \
int ulSenderPid; \
int ulReceiverCpuId;\
int ulReceiverPid; \
int uwLength;

这段代码是什么意思呢?

后面还有应用
typedef struct tagMsgCB
{
VOS_MSG_HEADER //这里VOS_MSG_HEADER怎么用的?
UINT8 aucValue[2];
} VOS_MSG_BLOCK;
...全文
258 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuwenying1985 2010-10-28
  • 打赏
  • 举报
回复
谢谢楼上的兄弟们,明白了,真希望分多些啊,可惜不能一一给。
东大坡居士 2010-10-26
  • 打赏
  • 举报
回复
宏就是替换,展开即可
碎碎念 2010-10-26
  • 打赏
  • 举报
回复
相当于这样。。。。。

typedef struct tagMsgCB
{
//VOS_MSG_HEADER //这里VOS_MSG_HEADER怎么用的?
int usSendSeqNum;
int usAckNum;
int ucIpcMsgType;
int ucFragFlg;
int ucReserved;
int ucPrio;
int ulSenderCpuId;
int ulSenderPid;
int ulReceiverCpuId;
int ulReceiverPid;
int uwLength;
UINT8 aucValue[2];
} VOS_MSG_BLOCK;

MFC底层代码里,很多这样的应用。。。。
whoareyou102 2010-10-26
  • 打赏
  • 举报
回复
………………
yutaooo 2010-10-26
  • 打赏
  • 举报
回复

我认为更关键的,LZ要去理解为什么这样做,这样做的好处在什么地方。

从最终的目的来说,是为了提高代码的可维护行,便于管理。

1.
C, C++以及许多的语言都是提倡“一次定义,到处引用”。“将维护点控制在单一处”。处于这样的理念,当发觉代码会有重复的时候,就会考虑能否将它们集中,而不要散布在程序的各个角落。

LZ应该再检查一下,是否还有其它地方用到了VOS_MSG_HEADER,做到了集中控制。在我看来,如果仅仅是在tagMsgCB中使用了这个宏,是体现不出太达优点的,属于过渡设计。

2.
命名,提高抽象。表明了这些变量都于VOS_MSG_HEADER。这个宏名是在提示,vos的消息头,包括了哪些东西。
hz_yck 2010-10-26
  • 打赏
  • 举报
回复
简化定义,而且利于强制转换,在数据上有继承的感觉
yskcg 2010-10-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 yuwenying1985 的回复:]
#define VOS_MSG_HEADER int usSendSeqNum; \
int usAckNum; \
int ucIpcMsgType; \
int ucFragFlg; \
int ucReserved; \
int ucPrio; \
int ulSenderCpuId; \
int ulSenderPid; \
int ulReceiverCpuId……
[/Quote]
直接放过来哈!
结果为:



typedef struct tagMsgCB
{
int usSendSeqNum;
int usAckNum;
int ucIpcMsgType;
int ucFragFlg;
int ucReserved;
int ucPrio;
int ulSenderCpuId;
int ulSenderPid;
int ulReceiverCpuId;
int ulReceiverPid;
int uwLength;
UINT8 aucValue[2];
} VOS_MSG_BLOCK;
yg2362 2010-10-26
  • 打赏
  • 举报
回复
就是这样

typedef struct tagMsgCB
{
int usSendSeqNum;
int usAckNum;
int ucIpcMsgType;
int ucFragFlg;
int ucReserved;
int ucPrio;
int ulSenderCpuId;
int ulSenderPid;
int ulReceiverCpuId;
int ulReceiverPid;
int uwLength;
UINT8 aucValue[2];
} VOS_MSG_BLOCK;
我是小数位 2010-10-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 freezezdj 的回复:]
typedef struct tagMsgCB
{
int usSendSeqNum;
int usAckNum;
int ucIpcMsgType;
int ucFragFlg;
int ucReserved;
int ucPrio;
int ulSenderCpuId;
int ulSenderPid;
int ulReceiverCpuId;
int ……
[/Quote]哈哈,来看什么情况
harderman 2010-10-26
  • 打赏
  • 举报
回复
使用头文件,简化了结构体,增加了程序的阅读性
mapoor 2010-10-26
  • 打赏
  • 举报
回复

// 后面还有应用
typedef struct tagMsgCB
{
VOS_MSG_HEADER //这里VOS_MSG_HEADER怎么用的?
UINT8 aucValue[2];
} VOS_MSG_BLOCK;

// 宏是纯文本替换 相当于:

VOS_MSG_BLOCK test;
test.usSendSeqNum=1;
test.usAckNum=1;
test.ucIpcMsgType=1;
冻结 2010-10-26
  • 打赏
  • 举报
回复
typedef struct tagMsgCB
{
int usSendSeqNum;
int usAckNum;
int ucIpcMsgType;
int ucFragFlg;
int ucReserved;
int ucPrio;
int ulSenderCpuId;
int ulSenderPid;
int ulReceiverCpuId;
int ulReceiverPid;
int uwLength;
UINT8 aucValue[2];
} VOS_MSG_BLOCK;

这样楼主明白了吗?
babybyba 2010-10-26
  • 打赏
  • 举报
回复
把VOS_MSG_HEADER 宏的内容原样放
typedef struct tagMsgCB
{
VOS_MSG_HEADER //复制过来
UINT8 aucValue[2];
} VOS_MSG_BLOCK;
就完了。
zzbinfo 2010-10-26
  • 打赏
  • 举报
回复
相当于这样:
typedef struct tagMsgCB
{
int usSendSeqNum;
int usAckNum;
int ucIpcMsgType;
int ucFragFlg;
int ucReserved;
int ucPrio;
int ulSenderCpuId;
int ulSenderPid;
int ulReceiverCpuId;
int ulReceiverPid;
int uwLength;
UINT8 aucValue[2];
} VOS_MSG_BLOCK;
phpjspasp 2010-10-26
  • 打赏
  • 举报
回复
定义了VOS_MSG_HEADER
定义了结构体之后,VOS_MSG_HEADER就没用了。
宏就是文本替换。
yuwenying1985 2010-10-26
  • 打赏
  • 举报
回复
高手指点啊,小弟第一次发帖,

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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