Travailler avec des énumérations typedef dans des structures et éviter les avertissements de mélange de types

Je travaille avec C99. Mon compilateur est IAR Embedded Workbench mais je suppose que cette question sera également valable pour d’autres compilateurs.

J’ai une énumération typedef avec quelques éléments et j’ai ajouté un élément à une structure de ce nouveau type

typedef enum { foo1, foo2 } foo_t; typedef struct { foo_t my_foo; ... } bar_t; 

Maintenant, je veux créer une instance de bar_t et initialiser toute sa mémoire à 0.

 bar_t bar = { 0u }; 

Cela génère un avertissement indiquant que je mélange un énuméré avec un autre type. Le numéro d’avertissement spécifique à l’IRA est Pe188. Il comstack et fonctionne parfaitement car une énumération est un entier non signé à la fin de la journée. Mais je voudrais éviter mille avertissements maladroits. Quelle est la méthode la plus simple pour initialiser les types de structure contenant des types énumérés sur 0?

Par souci d’argumentation, supposons que bar_t ait beaucoup de membres – je veux juste les mettre tous à 0. Je préfère ne pas taper quelque chose comme ceci:

 bar_t bar = { foo1, 0u, some_symbol,... , 0u}; 

EDIT: Note supplémentaire: je me conforme à MISRA. Donc, si une solution de contournement va violer MISRA, cela ne fait que déplacer le problème pour moi. À la place, je vais me faire chier par le vérificateur MISRA.

Si vous voulez vraiment, littéralement , initialiser toute la mémoire d’une structure à 0, alors ça s’écrit

 memset(&bar, 0, sizeof(bar_t)); 

C’est en fait assez courant, et cela a même tendance à fonctionner, mais techniquement, c’est incorrect pour ce que la plupart des gens veulent réellement. Il n’est pas garanti que la plupart des types d’éléments agissent correctement, car C donne moins de garanties que la plupart des gens ne pensent à la représentation de valeurs de différents types et à la signification de divers modèles de bits.

La manière correcte d’initialiser un object agrégé (tel qu’une structure) comme si vous assigniez la valeur zéro à chaque élément correspond à ce que vous avez commencé, bien que la manière canonique de l’écrire soit simplement

 bar_t bar = { 0 }; 

(pas besoin du suffixe ‘u’). Il existe une faible possibilité que cette variante évite l’avertissement du compilateur, même si je ne m’y attendrais pas vraiment.

Ashalynd donne la réponse qui me semble la plus correcte (c’est-à-dire

 bar_t bar = { foo1 }; 

) Si cela enfreint d’une manière ou d’une autre les conventions de code auxquelles vous devez vous conformer, alors vous pourriez peut-être réorganiser votre struct sorte que le premier élément soit d’un type autre qu’un type enum .