J’ai un code qui utilise des champs de bits déclarés comme suit
typedef struct my{ const char *name; uint8_t is_alpha : 1; uint8_t is_hwaccel : 1; uint8_t x_chroma_shift; uint8_t y_chroma_shift; } mystr;
uint8_t
est typé avec le caractère unsigned char
.
La construction du code dans MS-VS 2008 à l’aide de ces champs de bits donne l’avertissement suivant:
imgconvert.c (60): avertissement C4214: extension non standard utilisée: types de champ binary autres que int.
1] Existe-t-il des problèmes / problèmes potentiels liés à l’utilisation de champs de bits de type autre que int? Pourquoi l’avertissement?
Étant donné que les champs de bits sont de bas niveau, il peut y avoir des problèmes de portabilité si vous utilisez des types non standard. D’où l’avertissement – notez qu’il s’agit toujours d’un avertissement et non d’une erreur.
2] Sont-ils autorisés par la spécification du langage C99 C par rapport aux bits de type int?
Extrait du projet de C99:
6.7.2.1 Spécificateurs de structure et d’union
4 Un champ de bits doit avoir un type qui est une version qualifiée ou non qualifiée de _Bool, un entier signé, un entier non signé, ou un autre type défini par l’implémentation.
Pourquoi ne pas utiliser int
? L’implémentation réelle des champs de bits varie d’un compilateur à l’autre. Si vous voulez écrire du code portable, utilisez int
. Si vous souhaitez créer une petite structure, ou une structure d’un nombre d’octets fixe, ou une structure dans laquelle les bits sont à une position fixe, n’utilisez pas de champs de bits. Créez un membre uint8_t
appelé quelque chose comme des flags
et définissez les macros à utiliser comme masques de bits.