2013-04-24 10 views
6

tôi sử dụng sự kết hợp sau đây để đơn giản hóa byte, nibble và chút hoạt động:C++ cấu trúc vô danh

union Byte 
{ 
    struct { 
    unsigned int bit_0: 1; 
    unsigned int bit_1: 1; 
    unsigned int bit_2: 1; 
    unsigned int bit_3: 1; 
    unsigned int bit_4: 1; 
    unsigned int bit_5: 1; 
    unsigned int bit_6: 1; 
    unsigned int bit_7: 1; 
    }; 

    struct { 
    unsigned int nibble_0: 4; 
    unsigned int nibble_1: 4; 
    }; 

    unsigned char byte; 
}; 

Nó hoạt động tốt đẹp, nhưng nó cũng tạo ra cảnh báo này:

cảnh báo: ISO C++ cấm vô danh structs [-pedantic]

Ok, rất vui được biết. Nhưng ... làm thế nào để có được cảnh báo này ra khỏi đầu ra g + của tôi? Có khả năng viết một cái gì đó như công đoàn này mà không có vấn đề này?

+2

Tại sao không chỉ đơn giản là tên struct của bạn? –

+3

Bạn sẽ không thể làm những gì bạn đang cố gắng làm trong các cõi hợp lệ C++. Nó có thể hoạt động, nhưng nó sẽ là hành vi không xác định. –

+0

Tôi có thể đặt tên cho nó - ví dụ như struct nibbles và biến nó thành một lĩnh vực của một công đoàn. Nhưng sau đó tôi sẽ phải truy cập nó Byte.nibbles.nibble_0. Nó sẽ không được tốt đẹp để sử dụng;). – Dejwi

Trả lời

4

Tùy chọn trình biên dịch gcc -fms-extensions sẽ cho phép cấu trúc ẩn danh không chuẩn mà không cần cảnh báo.

(Điều đó cho phép những gì nó coi "Microsoft mở rộng")

Bạn cũng có thể đạt được hiệu quả tương tự trong hợp lệ C++ sử dụng Công ước này.

union Byte 
{ 
    struct bit { 
    unsigned int _0: 1; 
    unsigned int _1: 1; 
    unsigned int _2: 1; 
    unsigned int _3: 1; 
    unsigned int _4: 1; 
    unsigned int _5: 1; 
    unsigned int _6: 1; 
    unsigned int _7: 1; 
    }; 
    struct nibble { 
    unsigned int _0: 4; 
    unsigned int _1: 4; 
    }; 
    unsigned char byte; 
}; 

Với điều này, bạn phi tiêu chuẩn byte.nibble_0 trở thành quy phạm pháp luật byte.nibble._0

+2

Bạn đúng về dấu gạch dưới hàng đầu. Tên trong không gian tên toàn cục bắt đầu bằng dấu gạch dưới được dành riêng cho việc triển khai. Tên bắt đầu bằng dấu gạch dưới theo sau là một chữ hoa hoặc có chứa dấu gạch dưới kép cũng được dành riêng cho việc triển khai. - Xem 17.6.4.3.2 (C++ 11) –