Comment initialiser une structure en accord avec le langage de programmation C normes
Je veux initialiser une structure de l'élément, divisé dans la déclaration et l'initialisation. C'est 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 initialiser une variable locale de MY_TYPE
en conformité avec le langage de programmation C normes (C89, C90, C99, C11, etc.)? Ou est-il quelque chose de mieux ou au moins de travail?
Mise à jour j'ai fini par avoir une initialisation statique de l'élément où j'ai mis tous les sous-élément en fonction de mes besoins.
- vous devriez vraiment accepter une meilleure réponse, je vois que vous avait à l'utilisation de certains mauvais guide de codage, mais vous ne devriez pas dire à d'autres gens que c'est la bonne façon de le faire..
- ainsi, la plupart des bonnes réponses sont spécifiques à C99. Peut-être que ma question est un double de la stackoverflow.com/questions/6624975/... ?
- si c'était votre intention d'origine, alors oui, probablement, mais alors 1) le vote pourrait être trompeur. 2) par le haut des résultats de recherche c'est la seule qui montre le C99 chemin..... il serait préférable de ré-utiliser cette page pour C99 démonstration... (apparemment, les gens ont commencé à lien de cette page pour montrer comment le faire)
- Intéressant de noter que les acceptée (et fortement upvoted) réponse n'est pas réellement répondre à la question, de même que posté. Désigné initialiseurs de ne pas aborder le cas des OP problème, qui est de séparer la déclaration de l'initialisation. Pour le pré-1999 C, la seule vraie solution est d'attribuer à chaque membre; pour le C99 et plus tard, un composé littérale, comme dans CesarB réponse, est la solution. (Bien sûr, une réelle initialiseur, avec ou sans titres, serait encore mieux, mais apparemment, l'OP a été aux prises avec une très mauvaise norme de codage.)
- Strictement parlant, le terme "ANSI C" désigne le 2011 norme ISO, ANSI a adopté. Mais, dans la pratique, le terme "ANSI C" désigne communément l' (officiellement obsolète) 1989 standard. Par exemple, "gcc-ansi" encore applique 1989 standard. Puisque c'est l'ISO qui a publié, en 1990, 1999 et 2011 normes, il est préférable d'éviter le terme de "ANSI C", et de se référer à la date de la norme, si il n'y a aucune possibilité de confusion.
- Voir aussi Désignés initialiseurs et éléments omis un autre aspect de l'utilisation de désigné les initialiseurs. Ce n'est pas un doublon de cette question; il fournit des informations supplémentaires utiles.
Vous devez vous connecter pour publier un commentaire.
Dans (ANSI) C99, vous pouvez utiliser un désigné initialiseur pour initialiser une structure:
Edit: les Autres membres sont initialisés à zéro: "Omis membres de champ sont implicitement initialisé le même que les objets qui ont statique de la durée de stockage." (https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html)
Vous pouvez le faire avec un composé littérale. Selon cette page, il fonctionne en C99 (qui compte aussi comme C ANSI).
Les désignations dans les initialiseurs sont facultatifs; vous pouvez également écrire:
Je vois que vous avez déjà reçu une réponse au sujet de la norme ANSI C 99, donc je vais jeter un os sur le C ANSI 89.
ANSI C 89 vous permet d'initialiser une structure de cette façon:
Une chose importante à se rappeler, au moment de l'initialisation de même un objet/variable dans la structure, toutes les autres variables sont initialisées à la valeur par défaut.
Si vous n'avez pas initialiser les valeurs de votre structure, toutes les variables contiennent "des ordures valeurs".
Bonne chance!
a = (MYTYPE){ true, 15, 0.123 };
ferait l'affaire dans C99
Vous ai presque eu...
Rapide recherche sur l '"struct initialiser c' montre-moi ce
C langage de programmation standard ISO/IEC 9899:1999 (communément connu comme C99) permet d'utiliser un désigné initialiseur pour initialiser les membres d'une structure ou d'une union comme suit:
Il est défini dans
paragraph 7
, section6.7.8 Initialization
de la norme ISO/IEC 9899:1999 standard:Noter que
paragraph 9
du même article stipule que:Dans GNU GCC mise en œuvre toutefois omis membres sont initialisées à zéro ou zéro-comme le type-valeur appropriée. Comme indiqué dans la section 6.27 Désigné Initialiseurs de GCC GNU de documentation:
Compilateur Microsoft Visual C++ devrait soutenir désigné initialiseurs depuis la version 2013, selon le blog officiel de poste C++ De La Conformité De La Feuille De Route. Paragraphe
Initializing unions and structs
de Les initialiseurs l'article sur le site MSDN Visual Studio documentation suggère que sans nom des membres initialisé à zéro, comme les valeurs appropriées de même pour GNU GCC.ISO/IEC 9899:2011 standard (communément connu comme C11) qui a remplacé la norme ISO/IEC 9899:1999 conserve désigné initialiseurs en vertu de l'article
6.7.9 Initialization
. Il conserve égalementparagraph 9
inchangé.Nouveau ISO/IEC 9899:2018 standard (communément connu comme C18) qui a remplacé la norme ISO/IEC 9899:2011 conserve désigné initialiseurs en vertu de l'article
6.7.9 Initialization
. Il conserve égalementparagraph 9
inchangé.struct thing { union { char ch; int i; }; };
. La norme dit plus tard: "Si il y a moins d'initialiseurs dans un corset-ci-joint la liste qu'il y a des éléments ou des 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 y a d'éléments dans le tableau,le reste de la somme doit être initialisé implicitement le même que les objets qui ont statique de la durée de stockage."comme Ron Nuni dit:
Une chose importante à retenir: au moment de l'initialisation de même un objet/variable dans la structure, toutes les autres variables sont initialisées à la valeur par défaut.
Si vous n'avez pas initialiser les valeurs de votre structure (c'est à dire si vous venez de déclarer cette variable), tous les
variable.members
contiennent "des ordures valeurs", seulement si la déclaration est local!Si la déclaration est globales ou statiques (comme dans ce cas), tous les non initialisée
variable.members
sera initialisé automatiquement à:0
pour les entiers et à virgule flottante'\0'
pourchar
(bien sûr, c'est la même chose que0
, etchar
est un type entier)NULL
pour les pointeurs.const
?Si MS n'a pas mis à jour C99, MY_TYPE a = { true,15,0.123 };
J'ai trouvé une autre façon d'initialiser les structures.
La structure:
Initialisation:
Comme par GCC de la documentation, cette syntaxe est obsolète depuis la GCC 2.5.
Je n'aimais pas l'une de ces réponses j'ai donc fait mon propre. Je ne sais pas si c'est du C ANSI ou pas, c'est juste GCC 4.2.1 c'est le mode par défaut. Je n'ai jamais peux me rappeler le bracketing j'ai donc commencer avec un sous-ensemble de mes données et de faire la bataille avec les messages d'erreur du compilateur jusqu'à ce qu'il se tait. La lisibilité est ma première priorité.
Les données peuvent d'abord comme un fichier délimité par des tabulations que vous rechercher-remplacer de massage en quelque chose d'autre. Oui, c'est Debian choses. Alors, un à l'extérieur de la paire de {} (ce qui indique le tableau), puis une autre paire pour chaque structure à l'intérieur. Avec des virgules entre les deux. Mettre des choses dans un en-tête n'est pas strictement nécessaire, mais j'en ai environ 50 articles dans ma struct donc je veux dans un fichier distinct, à la fois pour garder le désordre de mon code et il est donc plus facile à remplacer.
Structure en C peut être déclaré et initialisé comme ceci:
J'ai lu le Microsoft Visual Studio 2015 de la Documentation pour l'Initialisation de Types de regroupement encore, toutes les formes de l'initialisation avec
{...}
y sont expliqués, mais l'initialisation avec dot, nommé "désignateur" n'est pas mentionné. Il ne fonctionne pas aussi.Le standard C99 chapitre 6.7.8 Initialisation explique la possibilité de lettres, mais dans mon esprit il n'est pas vraiment clair pour les complexes des structures. Le Standard C99 pdf .
Dans mon esprit, il peut être préférable de
= {0};
-initialisation de toutes les données statiques. Il est de moins en moins d'effort pour le code machine.Utiliser 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é, sa liste d'arguments peut être indépendant d'un changement de la structure du contenu. Il est bon si moins d'éléments doit être initialisé. Il est également bon pour les sous struct.
3. Un simple formulaire est: Initialiser dans un sous-programme:
Cette routine ressemble orientée objet en C. Utilisez
thiz
, pasthis
à compiler en C++ aussi!J'ai été à la recherche d'une belle façon d'initialiser mon struct, et j'ai obtenu à l'aide de la ci-dessous (C99). Cela me permet d'initialiser une seule structure ou un tableau de structures de la même manière que la plaine de types.
Ceci peut être utilisé dans le code:
jsmn_ts_default
, mais le reste des structures sont initialisés comme si le tableau avait statique de la durée de stockage, ce qui signifie que les membres sont initialisées àNULL
et0
. Mais si vous changez de#define jsmn_ts_default (jsmn_ts){"default", sizeof "default", NULL, 0}
vous verrez que seul le premier élément du tableau est tellement initialisé.int a[10] = {1};
Seulement le 1er élément sera==1