Chinaunix首页 | 论坛 | 博客
  • 博客访问: 335047
  • 博文数量: 92
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 960
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-21 19:38
文章分类

全部博文(92)

文章存档

2010年(71)

2009年(21)

我的朋友

分类: 嵌入式

2010-09-29 15:56:20

struct 的巨大作用

面对一个人的大型C/C++程序时,只看其对struct 的使用情况我们就可以对其编写者的编程经

验进行评估。因为一个大型的C/C++程序,势必要涉及一些(甚至大量)进行数据组合的结构体,这些结

构体可以将原本意义属于一个整体的数据组合在一起。从某种程度上来说,会不会用struct,怎样用

struct 是区别一个开发人员是否具备丰富开发经历的标志。

在网络协议、通信控制、嵌入式系统的C/C++编程中,我们经常要传送的不是简单的字节流(char

型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。

经验不足的开发人员往往将所有需要传送的内容依顺序保存在char 型数组中,通过指针偏移的

方法传送网络报文等信息。这样做编程复杂,易出错,而且一旦控制方式及通信协议有所变化,程序

就要进行非常细致的修改。

一个有经验的开发者则灵活运用结构体,举一个例子,假设网络或控制协议中需要传送三种报

文,其格式分别为packetApacketBpacketC

struct structA

{

int a;

char b;

};

struct structB

{

char a;

short b;

};

struct structC

{

int a;

char b;

float c;

}

优秀的程序设计者这样设计传送的报文:

struct CommuPacket

{int iPacketType; //报文类型标志

union //每次传送的是三种报文中的一种,使用union

{

struct structA packetA; struct structB packetB;

struct structC packetC;

}

};

在进行报文传送时,直接传送struct CommuPacket 一个整体。

假设发送函数的原形如下:

// pSendData:发送字节流的首地址,iLen:要发送的长度

Send(char * pSendData, unsigned int iLen);

发送方可以直接进行如下调用发送struct CommuPacket 的一个实例sendCommuPacket

Send( (char *)&sendCommuPacket , sizeof(CommuPacket) );

假设接收函数的原形如下:

// pRecvData:发送字节流的首地址,iLen:要接收的长度

//返回值:实际接收到的字节数

unsigned int Recv(char * pRecvData, unsigned int iLen)

接收方可以直接进行如下调用将接收到的数据保存在struct CommuPacket 的一个实例recvCommuPacket 中:

Recv( (char *)&recvCommuPacket , sizeof(CommuPacket) );

接着判断报文类型进行相应处理:

switch(recvCommuPacket. iPacketType)

{

case PACKET_A:

//A 类报文处理

break;

case PACKET_B:

//B 类报文处理

break;

case PACKET_C:

//C 类报文处理

break;

}

以上程序中最值得注意的是

Send( (char *)&sendCommuPacket , sizeof(CommuPacket) );

Recv( (char *)&recvCommuPacket , sizeof(CommuPacket) );

中的强制类型转换:(char *)&sendCommuPacket(char *)&recvCommuPacket,先取地址,再转化为char 型指针,

这样就可以直接利用处理字节流的函数。

利用这种强制类型转化,我们还可以方便程序的编写,例如要对sendCommuPacket 所处内存初始化为0,可以这

样调用标准库函数memset()

memset((char *)&sendCommuPacket,0, sizeof(CommuPacket));

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