2011-12-19 96 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; 

¿Qué significa :1 y :8?":" (dos puntos) en C struct - ¿Qué significa?

+6

[Campos de bits en C] (http://en.wikipedia.org/wiki/C_syntax#Bit_fields). – birryree

+0

Consulte http://en.wikipedia.org/wiki/Bit_field para ver ejemplos –

+47

"FOUR_RESERVED_BITS: 8" ... – RJFalconer

Respuesta

46

Aquellos son campos de bits. Básicamente, el número después del dos puntos describe cuántos bits utiliza ese campo. Aquí hay un quote from MSDN que describe los campos de bits:

La expresión constante especifica el ancho del campo en bits. El tipo-especificador para el declarador debe estar sin firmar int, signed int, o int, y la expresión-constante debe ser un valor entero no negativo. Si el valor es cero, la declaración no tiene declarador. Las matrices de los campos de bit , punteros a campos de bit y las funciones que devuelven campos de bit son no permitidas. El declarador opcional nombra el campo de bit. Los campos de bits solo se pueden declarar como parte de una estructura. El operador de dirección (&) no se puede aplicar a los componentes del campo de bits.

Los campos de bit sin nombre no se pueden hacer referencia, y su contenido en el momento de ejecutar es impredecible. Se pueden usar como campos "ficticios" para propósitos de alineación . Un campo de nombre sin nombre cuyo ancho se especifica como 0 garantiza que el almacenamiento para el miembro que lo sigue en la estructura-declaración-lista comienza en un límite int.

Este ejemplo define una matriz bidimensional de estructuras llamada pantalla.

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

Editar: otra cosa importante desde el enlace de MSDN:

Los campos de bits tienen la misma semántica que el tipo entero. Esto significa que un campo de bit se usa en expresiones exactamente de la misma manera que se usaría una variable del mismo tipo de base, independientemente de cuántos bits sean en el campo de bit.

Una muestra rápida lo muestra muy bien. Curiosamente, con los tipos mixtos, el compilador parece ser el predeterminado en 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

El enlace está obsoleto, por favor actualícelo. – zhangxaochen

+0

Actualizado con un nuevo enlace y texto de MSDN en caso de que el enlace desaparezca. – JoeFish

+0

Todavía no lo entiendo. ¿Significa eso que C++ fusiona automáticamente tus "variables" en el tamaño de un int, de modo que se usan todos los bits? ¿Puede convertir las estructuras de campo de bits en números para obtener el típico "* int con flags *"? –

6

define campos de bits de anchura 1 y 8.

+19

Si bien la respuesta es correcta, debe explicar qué campo de bit es _is_. –

4

También me encontré con la notación de colon, pero en mi contexto los campos de bit no tenían sentido. Así que hice algunas excavaciones. Esta notación también se usa para asignar valores, en mi situación específica, apunta a funciones.

Fuente: http://www.tldp.org/LDP/lkmpg/2.4/html/c577.htm

continuación se presenta una muestra y un extracto de explicar.

"Hay una extensión de gcc que hace que la asignación a esta estructura sea más conveniente. Lo verá en controladores modernos y puede sorprenderlo. Así es como se ve la nueva forma de asignar a la estructura :"

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

El C99 manera (edad, compatibles) se parece a:

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

¡También he visto esto! Siempre pensé que la extensión de gcc era '.x = y' y el estándar lo adoptó, hasta más tarde vi la notación' x: y'. El estándar se ve mejor, creo. – Shahbaz

+6

En primer lugar, esto no es una asignación, es * inicialización *. En segundo lugar, la característica que describes (* inicializadores designados *) no tiene absolutamente nada que ver con la cuestión (* campos de bit *). El hecho de que la extensión obsoleta de GCC use ':' en la sintaxis no significa que de ninguna manera esté relacionada con ':' en la pregunta. – AnT

+4

AnT, alguien que busque "C colon initialization colon" puede encontrar esta respuesta, y es exactamente lo que estaba buscando. Gracias, usuario27346! – ChrisPhoenix

Cuestiones relacionadas