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
.