Tôi cần phải tạo cấu trúc với bitfield để đóng gói một số dữ liệu đến từ phần cứng. Giả sử tôi sử dụng cơ chế biên dịch cụ thể để thực thi đóng gói và đặt hàng, là nó có thể để tạo ra một cấu trúc tương tự như sau (không đúng cú pháp):Bited lồng nhau trong C/C++
typedef struct _BYTE_OF_DATA
{
uint8_t Reserved1 : 2;
struct
{
uint8_t BitWithSomeMeaning : 1;
uint8_t BitWithSomeOtherMeaning : 1;
} BitsWithMeaning;
uint8_t Reserved2 : 4;
} BYTE_OF_DATA, *PBYTE_OF_DATA;
static_assert(sizeof(BYTE_OF_DATA) == 1, "Incorrect size");
nào sau đó có thể được truy cập như sau:
BYTE_OF_DATA byteOfData;
byteOfData.Reserved1 = 1;
byteOfData.BitsWithMeaning.BitWithSomeOtherMeaning = 0;
Lược đồ chính xác mà tôi đã mô tả ở trên sẽ không hoạt động, vì tôi đoán cấu trúc BitsWithMeaning
cần phải bắt đầu tại một ranh giới byte. Tôi đã tự hỏi nếu có một số mẹo khác mà tôi có thể đạt được điều này "làm tổ" của bitfields.
Macro có được phép không? Đây có phải là C++ hoặc C không? Tôi nghĩ rằng C + + bởi vì tôi không nghĩ rằng C có 'static_assert'. –
Vì có một 'static_assert', tôi đoán nó phải là C++, vì vậy thẻ C có lẽ nên được loại bỏ. –
C có 'static_assert' từ C11. Và câu hỏi cũng có thể có liên quan với C. – Morwenn