“:” (Deux-points) dans C struct – que signifie-t-il?

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’est-ce que :1 et :8 signifie?

Ce sont des champs de bits. Fondamentalement, le nombre après les deux-points décrit combien de bits ce champ utilise. Voici une citation de MSDN décrivant des champs de bits:

L’expression constante spécifie la largeur du champ en bits. Le spécificateur de type du déclarant doit être unsigned int, signed int ou int et l’expression-constante doit être une valeur entière non négative. Si la valeur est zéro, la déclaration n’a pas de déclarant. Les tableaux de champs de bits, les pointeurs vers les champs de bits et les fonctions renvoyant des champs de bits ne sont pas autorisés. Le déclarateur facultatif nomme le champ de bit. Les champs de bits ne peuvent être déclarés que dans le cadre d’une structure. L’adresse de l’opérateur (&) ne peut pas être appliquée aux composants du champ binary.

Les champs de bits sans nom ne peuvent pas être référencés et leur contenu au moment de l’exécution est imprévisible. Ils peuvent être utilisés comme champs “factices”, à des fins d’alignement. Un champ de bits sans nom dont la largeur est spécifiée comme 0 garantit que le stockage du membre qui le suit dans la liste de déclaration de structure commence sur une limite int.

Cet exemple définit un tableau à deux dimensions de structures nommées screen.

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

Edit: un autre élément important du lien MSDN:

Les champs de bits ont la même sémantique que le type entier. Cela signifie qu’un champ de bits est utilisé dans les expressions exactement de la même manière qu’une variable du même type de base serait utilisée, quel que soit le nombre de bits contenus dans le champ de bits.

Un exemple rapide illustre bien cela. Fait intéressant, avec des types mixtes, le compilateur semble avoir une sizeof (int) par défaut 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

J’ai aussi rencontré la notation par deux points, mais dans mon contexte, les champs de bits n’avaient aucun sens. J’ai donc fait quelques fouilles. Cette notation est également utilisée pour atsortingbuer des valeurs – dans mes situations spécifiques, des pointeurs vers des fonctions.

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

Vous trouverez ci-dessous un exemple et un extrait à expliquer.

Il y a une extension gcc qui rend l’assignation à cette structure plus pratique . Vous la verrez dans les pilotes modernes et vous surprendra peut-être. Voici à quoi ressemble la nouvelle façon d’atsortingbuer la structure:”

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

La méthode C99 (ancienne, compatible) ressemble à:

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

Il définit les champs de bits de largeur 1 et 8.