pragma pack對template結構的作用在VC7與gcc中差別

    最近本人利用template的偏特化編制了一個通用協議數據單元類CPdu。
CPdu的通用包頭定義如下:

#pragma pack(push,__PDU__,1)

template<long min_unknown,long max_unknown>
struct CommPduHeader
{
 long len   ; //pdu length,include 'len' filed
 short type  ; //pdu type
 
 ...
};

#pragma pack(pop,__PDU__)

 根據設計,CommPduHeader的實例的尺寸應該是6,例如:
sizeof(CommPduHeader<1,100>)應該爲6。在VC7下進行測試,
sizeof(CommPduHeader<1,100>)等於我們的預期值6。在將CPdu移植到
linux是發現sizeof(CommPduHeader<1,100>)則返回的是8,而不是我們預期
的6。這意味着同樣採用CPdu定義的通信協議,運行在linux與win32平臺上的
通信雙方無法正常通信。這直接導致CPdu的設計失效。
    顯然,sizeof(CommPduHeader<1,100>)=6纔是正確的結果,如果修改
CommPduHeader的定義是的sizeof(CommPduHeader<1,100>)在gcc下也返回6呢?
經過一段時間琢磨和測試,發現以下面的方式重定義CommPduHeader,gcc下
sizeof(CommPduHeader<1,100>)也返回我們的預期值6。

#pragma pack(push,__PDU__,1)

struct CommPduHeaderBase
{
 long len   ; //pdu length,include 'len' filed
 short type  ; //pdu type
};


template<long min_unknown,long max_unknown>
struct CommPduHeader : public CommPduHeaderBase
{
 ...
};

#pragma pack(pop,__PDU__)

修改好的定義,CommPduHeader的用法完全保持不變,而
sizeof(CommPduHeader<1,100>)=6。新的定義在VC7中也返回預期值。
這樣,通過調整引入CommPduHeaderBase,CPdu就可以適用於linux和
win32上了。

發佈了45 篇原創文章 · 獲贊 0 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章