Est-il valide d’utiliser une liste d’initialiseur désignée de style C99 pour initialiser les membres d’un champ de bits dans une union de la manière suivante?

Lorsque j’ai écrit une question sur PC-Lint , j’avais supposé que l’initialisation suivante était valide dans C99. @JoachimPileborg a mentionné que ce n’était peut-être pas le cas et que je n’avais trouvé aucune information fournissant un bon exemple d’une manière ou d’une autre. Je sais qu’il se comstack et se comporte comme je l’attendais, j’aimerais simplement savoir avec certitude qu’il s’agit du code C99 approprié.

Est-ce un moyen valide pour initialiser l’union suivante dans C99?

typedef union { struct { unsigned int a : 4; unsigned int b : 4; unsigned int c : 4; unsigned int d : 4; } bits; unsigned short value; } My_Value; int main (void) { My_value test[] = { { .bits.a = 2, .bits.b = 3, .bits.c = 2, .bits.d = 3, }, { .bits.a = 1, .bits.b = 1, .bits.c = 1, .bits.d = 0, }, }; /* Do something meaningful. */ return 0; } 

Semble sain d’esprit … si votre compilateur apprivoisé ne se plaint pas de la conformité aux normes, je l’utiliserais. Ce qui est encore plus inquiétant, c’est que vous essayez vraisemblablement de superposer de la value et des bits , et que l’intégration de données dans une variante d’un syndicat n’est pas définie . En dehors de l’endianisme, l’union utilisera probablement un mot entier et pourra très bien avoir la value d’un côté et les bits de l’autre (en fonction des instructions disponibles et de leur commodité ou de leur timing). Les normes déclarent ce non défini précisément pour donner aux implémentations une telle marge de manœuvre.