2012-01-19 40 views
13

Tôi viết một trình phân tích cú pháp cho một số cấu trúc dữ liệu, sau hàng giờ gỡ lỗi Tôi phát hiện ra rằng vấn đề là Visual Studio không giải thích các cấu trúc như tôi đã nói. Có vẻ như một số "đệm" được sử dụngĐịa phương vô hiệu hóa đệm

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 
}; 

Tôi mong đợi "sizeof (foo) = 4 * 4 + 2 = 18" nhưng tôi nhận được "sizeof (foo) = 20". Có khả năng để biến padding chỉ cho cấu trúc đặc biệt này? Tôi đã thử

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

nhưng nó không hoạt động. Cảm ơn sự giúp đỡ của bạn.

+0

Tôi nghĩ [bài viết này trên MSDN sẽ giúp] (http://msdn.microsoft.com/en-us/library/ms253935%28v=vs. 90% 29.aspx). –

+0

Bạn đang biên dịch với '/ Zp 1'? –

+1

@MartinBroadhurst Điều đó sẽ vô hiệu hóa toàn cầu padding, Giải pháp của hans hoạt động. – Listing

Trả lời

25

Sử dụng các chỉ thị #pragma pack cho rằng:

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

Cảm ơn bạn, hoạt động như một sự quyến rũ. – Listing

2

Visual Studio 2010 có #pragma pack để thực hiện những gì bạn đang tìm kiếm.

+0

Nhưng điều đó không ảnh hưởng đến tất cả các cấu trúc? Tôi chỉ muốn nó cục bộ cho một cấu trúc đó. – Listing

+1

Bạn có thể hoàn nguyên sau đó - thậm chí bạn đã đọc tài liệu đó chưa? –

+1

Bạn có thể sử dụng #pragma pack push/pop để giải quyết vấn đề đó. Chỉ cần đẩy trước và bật sau cấu trúc. –

Các vấn đề liên quan