您的位置:首页 > 编程语言 > C语言/C++

C/C++中struct深层探索

2008-02-26 16:53 274 查看
1. struct的巨大作用

  面对一个人的大型C/C++程序时,只看其对struct的使用情况我们就可以对其编写者的编程经验进行评估。因为一个大型的C/C++程序,势必要涉及一些(甚至大量)进行数据组合的结构体,这些结构体可以将原本意义属于一个整体的数据组合在一起。从某种程度上来说,会不会用struct,怎样用struct是区别一个开发人员是否具备丰富开发经历的标志。

  在网络协议、通信控制、嵌入式系统的C/C++编程中,我们经常要传送的不是简单的字节流(char型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。

  经验不足的开发人员往往将所有需要传送的内容依顺序保存在char型数组中,通过指针偏移的方法传送网络报文等信息。这样做编程复杂,易出错,而且一旦控制方式及通信协议有所变化,程序就要进行非常细致的修改。

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

packetA、packetB、packetC:

view plaincopy to clipboardprint?

struct structA

{

int a;

char b;

};

struct structB

{

char a;

short b;

};

struct structC

{

int a;

char b;

float c;

}

view plaincopy to clipboardprint?

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

struct CommuPacket

{

int iPacketType;  //报文类型标志

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

{

struct structA packetA;

struct structB packetB;

struct structC packetC;

}

};

//  优秀的程序设计者这样设计传送的报文:
struct CommuPacket
{
int iPacketType;  //报文类型标志
union      //每次传送的是三种报文中的一种,使用union
{
struct structA packetA;
struct structB packetB;
struct structC packetC;
}
};


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

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

view plaincopy to clipboardprint?

// 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) );

view plaincopy to clipboardprint?

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

memset((char *)&sendCommuPacket,0, sizeof(CommuPacket));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: