2012-01-19 19 views
13

Piszę parser dla pewnej struktury danych, po godzinach debugowania dowiedziałem się, że problem polega na tym, że Visual Studio nie interpretuje struktur tak, jak to mówię. Wydaje się pewne "wyściółka" służyLokalne wyłączanie padding

struct foo { 
unsigned char a; //0x00 
unsigned char b; //0x01 
unsigned int c; //0x02 
unsigned int d; //0x06 
unsigned int e; //0x0A 
unsigned int f; //0x0E 
//0x12 
}; 

spodziewałem "sizeof (foo) = 4 * 4 + 2 = 18", ale pojawia się "sizeof (foo) = 20". Czy istnieje możliwość wyłączenia padding tylko dla tej specjalnej struktury? Wypróbowałem

__declspec(align(1)) struct foo { ... 

ale to nie działa. Dziękuję za pomoc.

+0

myślę [ten artykuł w witrynie MSDN pomogą] (http://msdn.microsoft.com/en-us/library/ms253935%28v=vs. 90% 29.aspx). –

+0

Czy kompilujesz z '/ Zp 1'? –

+1

@MartinBroadhurst To by globalnie wyłączyć dopełnienie, Rozwiązanie hans działa. – Listing

Odpowiedz

25

użyć dyrektywy #pragma pack na to:

#pragma pack(push, 1) 
struct foo { 
    // etc.. 
}; 
#pragma pack(pop) 
+0

Dziękuję, działa jak urok. – Listing

2

Visual Studio 2010 ma #pragma pack, aby zrobić to, czego szukasz.

+0

Ale czy to nie wpłynie na wszystkie struktury? Po prostu chcę to lokalnie dla tej jednej struktury. – Listing

+1

Możesz je później przywrócić - czy nawet przeczytałeś tę dokumentację? –

+1

Możesz użyć #pragma pack push/pop, aby ominąć to. Wystarczy nacisnąć przed i pop po strukturze. –