2011-12-19 86 views
53
struct _USBCHECK_FLAGS 
    { 
     unsigned char DEVICE_DEFAULT_STATE  : 1; 
     unsigned char DEVICE_ADDRESS_STATE  : 1; 
     unsigned char DEVICE_CONFIGURATION_STATE : 1; 
     unsigned char DEVICE_INTERFACE_STATE  : 1; 
     unsigned char FOUR_RESERVED_BITS   : 8; 
     unsigned char RESET_BITS     : 8; 
    } State_bits; 

:1:8 có nghĩa là gì?":" (dấu hai chấm) trong cấu trúc C - ý nghĩa của nó là gì?

+6

[bitfields trong C] (http://en.wikipedia.org/wiki/C_syntax#Bit_fields). – birryree

+0

Xem http://en.wikipedia.org/wiki/Bit_field để biết các ví dụ –

+47

"FOUR_RESERVED_BITS: 8" ... – RJFalconer

Trả lời

46

Đó là các trường bit. Về cơ bản, số sau dấu hai chấm mô tả số bit mà trường đó sử dụng. Dưới đây là các trường bit mô tả quote from MSDN:

Biểu thức hằng số xác định chiều rộng của trường theo bit. Các loại-specifier cho người khai báo phải được unsigned int, ký int, hoặc int, và biểu thức liên tục phải là một giá trị số nguyên không âm. Nếu giá trị bằng 0, khai báo không có khai báo. Mảng của các trường bit , con trỏ tới các trường bit và các hàm trả về các trường bit là không được phép. Trình khai báo tùy chọn đặt tên cho trường bit. Các trường bit chỉ có thể được khai báo như một phần của cấu trúc. Không thể áp dụng địa chỉ của toán tử (&) cho các thành phần trường bit.

Không thể tham chiếu các trường bit không đặt tên và nội dung của chúng khi chạy thời gian là không thể đoán trước. Chúng có thể được sử dụng làm trường "giả", cho mục đích liên kết . Trường bit chưa đặt tên có chiều rộng được chỉ định là 0 đảm bảo rằng bộ nhớ cho thành viên theo sau trong danh sách cấu trúc khai báo bắt đầu trên một ranh giới int.

Ví dụ này xác định mảng hai chiều của các cấu trúc có tên là màn hình.

struct 
{ 
    unsigned short icon : 8; 
    unsigned short color : 4; 
    unsigned short underline : 1; 
    unsigned short blink : 1; 
} screen[25][80]; 

Chỉnh sửa: một chút quan trọng từ liên kết MSDN:

lĩnh vực Bit có ngữ nghĩa tương tự như kiểu số nguyên. Điều này có nghĩa là trường bit được sử dụng trong các biểu thức chính xác giống như một biến số của cùng một loại cơ sở sẽ được sử dụng, bất kể số bit là trong trường bit.

Mẫu nhanh minh họa điều này một cách độc đáo. Điều thú vị là, với các loại hỗn hợp, trình biên dịch dường như mặc định là sizeof (int).

struct 
    { 
    int a : 4; 
    int b : 13; 
    int c : 1; 
    } test1; 

    struct 
    { 
    short a : 4; 
    short b : 3; 
    } test2; 

    struct 
    { 
    char a : 4; 
    char b : 3; 
    } test3; 

    struct 
    { 
    char a : 4; 
    short b : 3; 
    } test4; 

    printf("test1: %d\ntest2: %d\ntest3: %d\ntest4: %d\n", sizeof(test1), sizeof(test2), sizeof(test3), sizeof(test4)); 

test1: 4

test2: 2

Test3: 1

test4: 4

+0

Liên kết đã lỗi thời, vui lòng cập nhật liên kết. – zhangxaochen

+0

Cập nhật với liên kết MSDN mới và văn bản trong trường hợp liên kết biến mất. – JoeFish

+0

Tôi vẫn chưa hiểu. Điều đó có nghĩa là C++ tự động hợp nhất các biến "của bạn" thành kích thước của một int, sao cho tất cả các bit được sử dụng? Bạn có thể cast bitior structiores thành các số để có được điển hình "* int with flags *". –

6

Nó xác định các trường bit có chiều rộng 1 và 8.

+19

Trong khi chính xác, câu trả lời sẽ giải thích một bitfield _is_ là gì. –

4

Tôi cũng chạy vào các ký hiệu đại tràng nhưng trong bối cảnh của tôi các trường bit không có ý nghĩa. Vì vậy, tôi đã làm một số đào. Ký pháp này cũng được sử dụng để gán các giá trị - trong các con trỏ tình huống cụ thể của tôi cho các hàm.

Nguồn: http://www.tldp.org/LDP/lkmpg/2.4/html/c577.htm

Dưới đây là mẫu và trích đoạn để giải thích.

"Có một tiện ích mở rộng gcc làm cho việc gán cho cấu trúc này thuận tiện hơn. Bạn sẽ thấy nó trong trình điều khiển hiện đại và có thể khiến bạn bất ngờ. Đây là cách mới để gán cho cấu trúc :"

struct file_operations fops = { 
    read: device_read, 
    write: device_write, 
    open: device_open, 
    release: device_release 
}; 

Các C99 (cũ, tương thích) cách trông giống như:

struct file_operations fops = { 
    .read = device_read, 
    .write = device_write, 
    .open = device_open, 
    .release = device_release 
}; 
+0

Tôi cũng đã thấy điều này! Tôi luôn nghĩ rằng phần mở rộng gcc là '.x = y' và tiêu chuẩn được chấp nhận, cho đến sau này tôi thấy ký hiệu' x: y'. Một tiêu chuẩn có vẻ tốt hơn, tôi tin. – Shahbaz

+6

Thứ nhất, đây không phải là nhiệm vụ, nó là * khởi tạo *. Thứ hai, tính năng bạn mô tả (* initializers được chỉ định *) hoàn toàn không có gì để làm với những gì các câu hỏi là về (* bit lĩnh vực *). Chỉ vì phần mở rộng GCC lỗi thời được sử dụng ':' trong cú pháp không có nghĩa là nó có bất kỳ cách nào liên quan đến ':' trong câu hỏi. – AnT

+4

AnT, ai đó đang tìm kiếm "C struct initialization colon" có thể tìm thấy câu trả lời này và đó chính xác là những gì tôi đang tìm kiếm. Cảm ơn, user27346! – ChrisPhoenix

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