2013-01-06 62 views
1

我已經定義了下面的結構。
託管.Net C++/CLI - 結構

typedef union 
{ 
    struct 
    { 
     unsigned command:15; 
     unsigned acknowledge:1; 
    }; 
    struct 
    { 
     unsigned short uicommand; 
    }; 
    struct 
    { 
     Byte command_bytes[2]; 
    }; 
}TCOMMAND; 

後然後聲明的類型TCOMMAND E.G

TCOMMAND mycommand 
int x=sizeof(mycommand) 

變量x的值是4個字節,而不是2. 啓示的問題將不勝感激。
在此先感謝。

回答

2

在C/C++ unsigned意味着unsigned int,即使你不分配所有的位字段的位,編譯器仍然會調整您的結構,以指定的數據類型。

因此,假設32位int(這是在Visual C++缺省值)的聯合的第一個結構是一樣的:

struct 
{ 
    unsigned int command:15; 
    unsigned int acknowledge:1; 
    unsigned int __unused:16; 
}; 

哪個是四個字節。

struct 
{ 
    unsigned short command:15; 
    unsigned short acknowledge:1; 
}; 
+0

優秀。完美工作! –

2

也許是因爲unsigned int有4字節對齊。如果您使用無符號短命令承認成員結構爲2個字節大。

+0

是的。工作完美謝謝 –

2

這是由編譯器選項造成的:如果你希望它是僅有的兩個字節在你的第一個結構使用unsigned short。較新的編譯器進行內存對齊。這也影響你的工會/結構的規模。有一些編譯解決方案,如#pragma pack。請參閱並嘗試下面的代碼。

#pragma pack(push, 1) 
typedef union 
{ 
    struct 
    { 
     unsigned command:15; 
     unsigned acknowledge:1; 
    }; 
    struct 
    { 
     unsigned short uicommand; 
    }; 
    struct 
    { 
     Byte command_bytes[2]; 
    }; 
}TCOMMAND; 
#pragma pack(pop) 

push, 1告訴編譯器將塊對齊到1個字節。這是舊版編譯器的默認值,但可能隨新版編譯器而改變。

+0

不完全..仍然出來作爲4個字節..該#pragma包真的沒有打包..實際上它什麼也沒有看得見。解壓縮結構的第一部分作爲unsigned short雖然工作.. 謝謝。 –

+0

然後我的答案在這種情況下是錯誤的。但是請記住,編譯器可能會導致不同的大小調整問題,並且我的答案對於其他方案是正確的。 –

+0

其實你的答案確實有幫助。我在另一個我創建的結構中使用了TCOMMAND,並且沒有將#pragma pack語句包裹在兩個結構中,它們沒有對齊。你的回答是正確的。我現在要把所有的結構都包裹起來! 謝謝。 彼得 –