2012-12-03 44 views
12

Có thể nói với GCC không nên sử dụng đệm cho cấu trúc. Điều này được thực hiện bằng cách sử dụng __attribute__((packed)).Làm thế nào để khai báo cấu trúc đóng gói (không có đệm) cho LLVM?

typedef struct { 

    uint8_t startSymbol; 
    uint8_t packetType; 
    uint32_t deviceId; 
    uint16_t packetCRC; 

} PacketData __attribute__((packed)); 

Tuy nhiên, Xcode mới nhất sử dụng LLVM và không nhận ra thuộc tính. Làm thế nào để xác định cấu trúc đóng gói cho LLVM?

Mô tả đầy đủ các vấn đề có thể được tìm thấy here

CẬP NHẬT Tôi đang sử dụng Xcode 4.5.1 dành cho iOS của Apple trong đó sử dụng LLVM 4.1 trình biên dịch. Tôi nhận được "'đóng gói' thuộc tính bỏ qua" cảnh báo trong Xcode trong ví dụ mã trên.

+0

Tôi có thiếu thứ gì đó hay đây là tính năng xóa mới? Lần cuối cùng tôi kiểm tra, clang hỗ trợ '__attribute __ ((đóng gói))' ... –

+0

clang hỗ trợ chính xác '__attribute __ ((đóng gói))' pragma ... – birryree

+0

Không có ý tưởng :) Tôi đang sử dụng Xcode 4.5. 1 cho iOS sử dụng trình biên dịch Apple LLVM 4.1. – Centurion

Trả lời

21

Bạn có thực sự dùng thử không? Tôi vừa thử nghiệm nó trên máy của tôi, và __attribute__((packed)) phạt tiền được biên soạn bằng cách sử dụng clang.

Edit: tôi đã cảnh báo tương tự ("Cảnh báo: đóng gói thuộc tính không sử dụng") cho

typedef struct { 
    int a; 
    char c; 
} mystruct __attribute__((packed)); 

và trong trường hợp này là sizeof(mystruct) 8.

Tuy nhiên,

typedef struct __attribute__((packed)) { 
    int a; 
    char c; 
} mystruct; 

chỉ hoạt động tốt và sizeof(mystruct) là 5.

Kết luận: có vẻ như thuộc tính cần phải đặt trước nhãn cấu trúc để làm việc này.

+0

Vâng, tôi đã làm nó ngay bây giờ. Tôi đang sử dụng Xcode 4.5.1 cho iOS sử dụng trình biên dịch Apple LLVM 4.1. Tôi nhận được "'đóng gói' thuộc tính bỏ qua" cảnh báo trong Xcode – Centurion

+0

@Centurion Sau đó kiểm tra 'sizeof (PacketData)' để xem cảnh báo là tranh luận. Clang trên Linux xử lý pragma tốt. – chrisaycock

+0

@Centurion Nó không có nghĩa là nó được công nhận/hỗ trợ không được sử dụng? Bạn đang thực sự instantiating cấu trúc bất cứ nơi nào trong mã? –

5

Bạn có thể sử dụng chỉ thị tiền xử lý để xác định sự liên kết byte cho struct vì vậy không đệm sẽ được thực hiện bởi trình biên dịch:

#pragma pack(1)

typedef struct{
char t1;
long long t2;
char t3;
}struct_size_test;

#pragma options align=reset

Xem câu trả lời cho this câu hỏi về lưu lượng truy cập stackoverflow.

0

kêu vang 3,5 trên Linux -

typedef struct __attribute__((packed)) thing1 { int blah; } THING_ONE;

làm việc.

+0

Đã có câu trả lời cho biết chính xác điều này, tại sao lại thêm một câu trả lời khác? – Johan

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