2011-07-18 43 views
8

Tôi đã tự hỏi nếu có một chỉ thị GCC C Compiler cho phép tôi xác định thứ tự bit để đóng gói của một cấu trúc? Một cái gì đó để những cái tên như:Làm thế nào để thực thi thứ tự bit struct với trình biên dịch GCC?

#pragma bit_order left 

Lý do cho một nhu cầu như vậy là tôi có cơ cấu như sau:

struct { 
     union { 
      unsigned char BYTE; 
      struct { 
       unsigned char B0: 1; 
       unsigned char B1: 1; 
       unsigned char B2: 1; 
       unsigned char B3: 1; 
       unsigned char B4: 4; 
      }BIT; 
     }ITEM; 
} myStruct; 

Với cấu trúc này, tôi muốn trình biên dịch để đóng gói nó theo cách này:

Bit order: | 7 6 5 4 3 2 1 0 | 
Label:  |B0 B1 B2 B3 B4 B5 B6 B7 | 

Thay vì cách GCC làm nó:

Bit order: | 7 6 5 4 3 2 1 0 | 
Label:  |B7 B6 B5 B4 B3 B2 B1 B0 | 

Tôi đang đối phó với MCUs có tệp tiêu đề lớn có cấu trúc tính toán bù trừ bit theo địa chỉ phần cứng được chỉ định. Tôi hy vọng rằng có một chỉ thị trình biên dịch trong trình biên dịch GCC C mà không trao đổi thứ tự bit cho tôi trước khi tôi cố gắng lật tất cả các lĩnh vực trong các nhà sản xuất cung cấp tập tin.

+0

kích thước và trình tự, trình biên dịch superset https://stackoverflow.com/questions/1490092/cc-force-bit-field-order-and-alignment làm 'tập hợp con làm việc packed': https://stackoverflow.com/questions/1756811/does-gccs-attribute-packed-retain-the-original-ordering –

Trả lời

12

Bạn đang sử dụng phiên bản GCC nào và nền tảng nào? Một pragma tồn tại mà có thể làm các trick, nhưng nó không hoạt động trên x86 bắt đầu với GCC 4.

#pragma reverse_bitfields on 

Xem thêm chi tiết tại địa chỉ:

http://groups.google.com/group/gnu.gcc.help/browse_thread/thread/747918655affa5c0?pli=1

Nếu bạn không nhớ xây dựng lại GCC , tất cả các thiết lập xây dựng có liên quan đang ở đây (tìm kiếm bitfield):

http://gcc.gnu.org/onlinedocs/gccint/Storage-Layout.html

Một số chi tiết về bitfields là xấu:

C/C++: Force Bit Field Order and Alignment

+1

Cảm ơn rất nhiều bạn! Đó thực sự là thông tin! Chi nhánh mà họ đã tắt GCC là phiên bản 4.3.0. Tài liệu của Trình biên dịch GCC C mà tôi có cho MCU mục tiêu đó khá thưa thớt và tôi đang cố gắng tận dụng tối đa nó. Có vẻ như cách duy nhất là tự mình sắp xếp lại các cấu trúc. Một lần nữa xin cảm ơn vì đã giúp tôi đẩy nhanh quá trình đến một giải pháp khả thi :) – Vern

+1

+1 cho liên kết Sắp xếp Thứ tự Lực lượng và Liên kết Căn chỉnh –

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