Je veux initialiser un élément struct, divisé en déclaration et initialisation. Voici ce que j'ai:
typedef struct MY_TYPE {
bool flag;
short int value;
double stuff;
} MY_TYPE;
void function(void) {
MY_TYPE a;
...
a = { true, 15, 0.123 }
}
Est-ce la façon de déclarer et d'initialiser une variable locale MY_TYPE
conformément aux normes du langage de programmation C (C89, C90, C99, C11, etc.)? Ou y a-t-il quelque chose de mieux ou au moins de travailler?
Mise à jour J'ai fini par avoir un élément d'initialisation statique où je définissais chaque sous-élément en fonction de mes besoins.
c
struct
initialization
reculer
la source
la source
Réponses:
Dans (ANSI) C99, vous pouvez utiliser un initialiseur désigné pour initialiser une structure:
Modifier: les autres membres sont initialisés à zéro: "Les membres de champ omis sont implicitement initialisés de la même manière que les objets qui ont une durée de stockage statique." ( https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html )
la source
Vous pouvez le faire avec un littéral composé . Selon cette page, cela fonctionne en C99 (qui compte également comme ANSI C ).
Les désignations dans les initialiseurs sont facultatives; vous pouvez également écrire:
la source
Je vois que vous avez déjà reçu une réponse sur ANSI C 99, donc je vais jeter un os sur ANSI C 89. ANSI C 89 vous permet d'initialiser une structure de cette façon:
Une chose importante à retenir, au moment où vous initialisez même un objet / variable dans la structure, toutes ses autres variables seront initialisées à la valeur par défaut.
Si vous n'initialisez pas les valeurs dans votre structure, toutes les variables contiendront des "valeurs inutiles".
Bonne chance!
la source
a = (MYTYPE){ true, 15, 0.123 };
ferait bien en C99
la source
Vous l'avez presque compris ...
Une recherche rapide sur 'struct initialize c' me le montre
la source
La norme de langage de programmation C ISO / IEC 9899: 1999 (communément appelée C99) permet d'utiliser un initialiseur désigné pour initialiser les membres d'une structure ou d'une union comme suit:
Il est défini dans la
paragraph 7
section6.7.8 Initialization
de la norme ISO / IEC 9899: 1999 comme:Notez que
paragraph 9
de la même section déclare que:Dans la mise en œuvre de GNU GCC, cependant, les membres omis sont initialisés en tant que valeur appropriée de type zéro ou de type zéro. Comme indiqué dans la section 6.27 Initialiseurs désignés de la documentation GNU GCC:
Le compilateur Microsoft Visual C ++ devrait prendre en charge les initialiseurs désignés depuis la version 2013 selon le blog officiel C ++ Conformance Roadmap . Paragraphe
Initializing unions and structs
des initialiseurs article dans la documentation MSDN Visual Studio suggère que les membres non nommés sont initialisés à des valeurs appropriées de type zéro similaires à GNU GCC.La norme ISO / IEC 9899: 2011 (communément appelée C11) qui avait remplacé ISO / IEC 9899: 1999 conserve les initialiseurs désignés dans la section
6.7.9 Initialization
. Il conserve égalementparagraph 9
inchangé.La nouvelle norme ISO / IEC 9899: 2018 (communément appelée C18) qui avait remplacé ISO / IEC 9899: 2011 conserve les initialiseurs désignés dans la section
6.7.9 Initialization
. Il reste égalementparagraph 9
inchangé.la source
struct thing { union { char ch; int i; }; };
. La norme dit plus tard: "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 un littéral de chaîne utilisé 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 comme les objets qui ont une durée de stockage statique. "comme l'a dit Ron Nuni:
Une chose importante à retenir: au moment où vous initialisez même un objet / variable dans la structure, toutes ses autres variables seront initialisées à la valeur par défaut.
Si vous n'initialisez pas les valeurs dans votre structure (c'est-à-dire si vous déclarez simplement cette variable), toutes
variable.members
contiendront des "valeurs de poubelle", seulement si la déclaration est locale!Si la déclaration est globale ou statique (comme dans ce cas), tous les non initialisés
variable.members
seront initialisés automatiquement à:0
pour les nombres entiers et virgule flottante'\0'
pourchar
(bien sûr, c'est la même chose que0
, etchar
c'est un type entier)NULL
pour les pointeurs.la source
la source
Si MS n'a pas mis à jour vers C99, MY_TYPE a = {true, 15,0.123};
la source
J'ai trouvé une autre façon d'initialiser les structures.
La structure:
Initialisation:
Selon la documentation de GCC, cette syntaxe est obsolète depuis GCC 2.5 .
la source
Je n'ai aimé aucune de ces réponses, alors j'ai fait la mienne. Je ne sais pas si c'est ANSI C ou pas, c'est juste GCC 4.2.1 dans son mode par défaut. Je ne me souviens jamais du bracketing, donc je commence avec un sous-ensemble de mes données et je me bats avec les messages d'erreur du compilateur jusqu'à ce qu'il se ferme. La lisibilité est ma première priorité.
Les données peuvent commencer la vie comme un fichier délimité par des tabulations que vous recherchez-remplacez pour masser dans autre chose. Oui, c'est des trucs Debian. Donc une paire extérieure de {} (indiquant le tableau), puis une autre paire pour chaque structure à l'intérieur. Avec des virgules entre. Mettre des choses dans un en-tête n'est pas strictement nécessaire, mais j'ai environ 50 éléments dans ma structure, donc je les veux dans un fichier séparé, à la fois pour garder le désordre de mon code et donc c'est plus facile à remplacer.
la source
La structure en C peut être déclarée et initialisée comme ceci:
la source
J'ai déjà lu la documentation de Microsoft Visual Studio 2015 pour l'initialisation des types d'agrégats , toutes les formes d'initialisation avec
{...}
sont expliquées, mais l'initialisation avec point, nommée `` désignateur '' n'y est pas mentionnée. Cela ne fonctionne pas non plus.Le standard C99 chapitre 6.7.8 Initialisation explique la possibilité des désignateurs, mais dans mon esprit ce n'est pas vraiment clair pour les structures complexes. La norme C99 en pdf .
Dans mon esprit, il vaut peut-être mieux
= {0};
initialisation pour toutes les données statiques. C'est moins d'effort pour le code machine.Utilisez des macros pour l'initialisation, par exemple
typedef MyStruct_t{ int x, int a, int b; } MyStruct; define INIT_MyStruct(A,B) { 0, A, B}
La macro peut être adaptée, sa liste d'arguments peut être indépendante du contenu struct modifié. Il convient que moins d'éléments soient initialisés. Il convient également pour les structures imbriquées. 3. Un formulaire simple est: Initialiser dans un sous-programme:
Cette routine ressemble à ObjectOriented en C. Utilisez
thiz
, pasthis
pour la compiler avec C ++ aussi!la source
Je cherchais un bon moyen d'initialiser ma structure, et je dois utiliser le ci-dessous (C99). Cela me permet d'initialiser une seule structure ou un tableau de structures de la même manière que les types simples.
Cela peut être utilisé dans le code comme:
la source
jsmn_ts_default
, mais les autres structures sont initialisées comme si le tableau avait une durée de stockage statique, ce qui signifie que les membres sont initialisés àNULL
et0
. Mais si vous passez à,#define jsmn_ts_default (jsmn_ts){"default", sizeof "default", NULL, 0}
vous verrez que seul le premier élément du tableau est ainsi initialisé.int a[10] = {1};
Seul le 1er élément sera==1