(C/C++)struct結構體

對程序員的經驗進行評估可以通過看其對struct結構體的使用情況。
會不會用struct,怎樣使用struct,是區別一個開發人員是否具備豐富開發經歷的標誌。

在嵌入式系統的C/C++代碼編程中,經常要傳送的不是簡單的字節流(char型數組),而是多種數據組合起來的一個整體,表現形式就是結構體。而經驗不足的開發人員使用char型數組,通過指針偏移的方式進行報文傳送。這樣做一編寫複雜,出錯率高,可移植性差。

例:
傳送A,B,C三種報文。

struct A
{
    int a;
    char b;
};

struct B
{
    char a;
    short b;
};

struct C
{
    int a;
    char b;
    float c;
};

優秀的報文設計:

struct commu_packet
{
    int packet_type;
    union
    {
        struct A packetA;
        struct B packetB;
        struct C packetC;
    };
};

這樣在傳送報文時就可以直接傳送struct commu_packet.
假如發送函數原型如下:

//pSendData:要發送字節流的首地址
//iLen:    要發送的字節流長度
send(char *pSendData,unsigned int iLen)
{
    ......
};

j接收函數原型如下:

//pRcevData:接收字節流首地址
//ILen:     要接受字節流長度
//return:   返回實際收到的字節數
unsigned int recv(char *pRcevData,unsigned int iLen)
{
    ......
};

則,發送struct commu_packet的一個實例send_packet如下:
send((char*)&send_packet,sizeof(commu_packet));
接收保存在struct commu_packet的一個實例recv_packet如下:
recv((char*)&recv_packet,sizeof(commu_packet));
接着,判斷報文類型並進行處理:

……
        switch(recv_packet.packet_type)
        {
            case packetA:
            ……
            break;
            case packetB:
            ……
            break;
            case packetC:
            ……
            break;
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章