Les champs de bits de type autre que int?

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 / des problèmes potentiels liés à l’utilisation de champs de bits de type autre que int? Pourquoi l’avertissement?
  2. Les types de fichiers autres que int sont-ils autorisés par la spécification du langage C99?

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.