En C, que signifie un colon dans une déclaration?

Duplication possible:
Que signifie “temp non signé: 3”?

J’apprends du code du kernel et je suis arrivé sur la ligne suivante (sous linux 2.4, sched.h, struct mm_struct):

unsigned dumpable:1; 

Qu’est-ce que ça veut dire?

C’est un membre bitfield . Votre code signifie que dumpable occupe exactement 1 bit dans la structure.

Les champs de bits sont utilisés lorsque vous souhaitez regrouper les membres au niveau du bit. Cela peut réduire considérablement la taille de la mémoire utilisée quand il y a beaucoup de drapeaux dans la structure. Par exemple, si on définit une structure ayant 4 membres avec une contrainte numérique connue

 0 < a < 20 b in [0, 1] 0 < c < 8 0 < d < 100 

alors la structure pourrait être déclarée comme

 struct Foo { unsigned a : 5; // 20 < 2^5 = 32 unsigned b : 1; // unsigned c : 3; // unsigned d : 7; // 100 < 2^7 = 128 }; 

alors les bits de Foo peuvent être disposés comme

  ddddddd c cc b aaaaa --------- --------- --------- ---------- octet 1 octet 0 =========================================== uint32 

au lieu de

 struct Foo { unsigned a; unsigned b; unsigned c; unsigned d; }; 

dans lequel beaucoup de bits sont gaspillés à cause de la gamme de valeurs

 # wasted space which is not used by the program # vv ddddddd ccc ------------------------------------ ------------------------------------ uint32 uint32 b aaaaa ------------------------------------ ------------------------------------ uint32 uint32 

Vous pouvez ainsi économiser de l’espace en regroupant de nombreux membres.

Notez que la norme C ne spécifie pas comment les champs de bits sont organisés ou emballés dans une "unité de stockage adressable". En outre, les champs de bits sont plus lents que l’access direct aux membres.

Cela signifie qu’il s’agit d’un champ de bits – c’est-à-dire que la taille de la sauvegarde est un seul bit, et vous ne pouvez lui affecter que 0 ou 1. Normalement utilisé dans l’ancien code pour économiser de l’espace, ou dans un code de bas niveau qui s’interface avec le matériel (même si l’emballage n’est pas portable). Voir ici pour plus d’informations

Si je me souviens bien, lorsqu’il est utilisé à l’intérieur d’une structure, le nombre après les deux points signifie combien de bits constituent la variable (ou un champ de bits).

Donc unsigned dumpable:1; est un bitfield à un seul bit.