面對一個人的大型C/C++程序時,只看其對struct 的使用情況我們就可以對其編寫者的編程經(jīng)驗進行評估。因為一個
大型的C/C++程序,勢必要涉及一些(甚至大量)進行數(shù)據(jù)組合的結(jié)構(gòu)體,這些結(jié)構(gòu)體可以將原本意義屬于一個整體的數(shù)據(jù)組合在一起。從某種程度上來
說,會不會用struct,怎樣用struct 是區(qū)別一個開發(fā)人員是否具備豐富開發(fā)經(jīng)歷的標志。
在網(wǎng)絡(luò)協(xié)議、通信控制、嵌入式系統(tǒng)的C/C++編程中,我們經(jīng)常要傳送的不是簡單的字節(jié)流(char型數(shù)組),而是多種數(shù)據(jù)組合起來的一個整體,其表現(xiàn)形式是一個
結(jié)構(gòu)體。經(jīng)驗不足的開發(fā)人員往往將所有需要傳送的內(nèi)容依順序保存在char 型數(shù)組中,通過指針偏移的方法傳送網(wǎng)絡(luò)報文等信息。這樣做編程復雜,易
出錯,而且一旦控制方式及通信協(xié)議有所變化,程序就要進行非常細致的修改。
一個有經(jīng)驗的開發(fā)者則靈活運用結(jié)構(gòu)體,舉一個例子,假設(shè)網(wǎng)絡(luò)或控制協(xié)議中需要傳送三種報文,其格式分別為packetA、packetB、packetC:
struct structA
{
int a;
char b;
};
struct structB
{
char a;
short b;
};
struct structC
{
int a;
char b;
float c;
}
優(yōu)秀的程序設(shè)計者這樣設(shè)計傳送的報文:
struct CommuPacket
{
int iPacketType;
//報文類型標志
union
//每次傳送的是三種
報文中的一種,使用union
{
struct structA packetA; struct structB packetB;
struct structC packetC;
}
};
在進行報文傳送
時,直接傳送struct CommuPacket 一個整體。
假設(shè)發(fā)送函數(shù)的原形如下:
// pSendData:發(fā)送字節(jié)流的首地址,iLen:要發(fā)送的長度
Send(char * pSendData, unsigned int iLen);
發(fā)送方可以直接進行如下調(diào)用發(fā)送struct CommuPacket 的一個實例sendCommuPacket:
Send( (char *)&sendCommuPacket , sizeof(CommuPacket) );
假設(shè)接收函數(shù)的原
形如下:
// pRecvData:發(fā)送字節(jié)流的首地址,iLen:要接收的長度
//返回值:實際接收到的字節(jié)數(shù)
unsigned int Recv(char * pRecvData, unsigned int iLen);
接收方可以直接進行如下調(diào)用將接收到的數(shù)據(jù)保存在struct
CommuPacket 的一個實例recvCommuPacket
中:
Recv( (char *)&recvCommuPacket , sizeof(CommuPacket) );
接著判斷報文類型進行相應(yīng)處理:
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) );
中的強制類型轉(zhuǎn)換:(char *)&sendCommuPacket、(char *)&recvCommuPacket,
先取地址,再轉(zhuǎn)化為char 型指針,這樣就可以直接利用處理字節(jié)流的函數(shù)。
利用這種強制類型轉(zhuǎn)化,我們還可以方便程序的編寫,例如要
對sendCommuPacket
所處內(nèi)存初始化為0,可以這樣調(diào)用標準庫函數(shù)memset():
memset((char *)&sendCommuPacket,0, sizeof(CommuPacket));
原文; http://www.arm16.com/viewthread.php?tid=397