Le premier est le plus simple ( implique moins de frappe ), et il est garanti de fonctionner, tous les membres seront définis sur 0
[Ref 1] .
Le second est plus lisible.
Le choix dépend de la préférence de l'utilisateur ou de celle que votre norme de codage impose.
[Ref 1] Référence C99 Standard 6.7.8.21:
S'il y a moins d'initialiseurs dans une liste entre accolades qu'il n'y a d'éléments ou de membres d'un agrégat, ou moins de caractères dans une chaîne littérale utilisée pour initialiser un tableau de taille connue qu'il n'y a d'éléments dans le tableau, le reste de l'agrégat doit être initialisé implicitement de la même manière que les objets qui ont une durée de stockage statique.
Bonne lecture:
C et C ++: initialisation partielle de la structure automatique
= {};
Cependant, je ne suis pas sûr que cela soit valide.foo = {0}
veut dire. Si je voyaisfoo = ZERO_FULL
, je devrais grep pour la définition de ZERO_FULL.Si les données sont une variable statique ou globale, elles sont remplies de zéro par défaut, alors déclarez-la simplement
myStruct _m;
Si les données sont une variable locale ou une zone allouée au tas, effacez-les avec
memset
comme:Les compilateurs actuels (par exemple les versions récentes de
gcc
) optimisent cela assez bien dans la pratique. Cela ne fonctionne que si toutes les valeurs nulles (y compris les pointeurs nulles et la virgule flottante zéro) sont représentées comme tous les bits zéro, ce qui est vrai sur toutes les plates-formes que je connais (mais le standard C autorise les implémentations où c'est faux; je ne connais pas une telle implémentation) .Vous pourriez peut-être coder
myStruct m = {};
oumyStruct m = {0};
(même si le premier membre demyStruct
n'est pas un scalaire).Mon sentiment est que l'utilisation
memset
pour les structures locales est la meilleure, et cela traduit mieux le fait qu'au moment de l'exécution, quelque chose doit être fait (alors que généralement, les données globales et statiques peuvent être comprises comme initialisées au moment de la compilation, sans aucun coût au moment de l'exécution) .la source
0
sera équivalent à l'initialisation de tous les membres de la structure avec0
bien. Sur de nombreuses plates-formes, ce sera vrai, mais pas partout.{}
n'est pas valide C mais uniquement disponible en C ++.NULL
pointeur qui n'était pas tous0
bits: c-faq.com/null/machexamp.html . Et puis il y a la possibilité que la plate-forme n'utilise pas IEEE 754 pour représenter des valeurs en virgule flottante, mais utilise une autre représentation qui n'a pas une valeur de tous les0
bits0.0
- mais il est vrai que je ne connais pas une telle plate-forme.Voir §6.7.9 Initialisation:
Donc, oui, les deux fonctionnent. Notez qu'en C99, une nouvelle méthode d'initialisation, appelée initialisation désignée, peut également être utilisée:
la source