Initialisation d'une structure globale en C
Quelle est la meilleure façon d'accomplir les tâches suivantes dans le C?
#include <stdio.h>
struct A
{
int x;
};
struct A createA(int x)
{
struct A a;
a.x = x;
return a;
}
struct A a = createA(42);
int main(int argc, char** argv)
{
printf("%d\n", a.x);
return 0;
}
Lorsque j'essaie de compiler le code ci-dessus, le compilateur signale l'erreur suivante:
"initialiseur élément n'est pas constante"
La mauvaise ligne est celui-ci:
struct A a = createA(42);
Quelqu'un peut m'expliquer quel est le problème? Je ne suis pas très expérimenté en C. Merci!
source d'informationauteur Scott
Vous devez vous connecter pour publier un commentaire.
Pourquoi ne pas utiliser initialisation statique?
Plus de membres:
Vous pouvez également faire de
La même chose travaille pour les syndicats, et vous n'avez pas à inclure tous les membres ou même les mettre dans le bon ordre.
Le problème ici est que le fichier /variables statiques en C doit avoir une valeur connue au moment de la compilation. Cela signifie que vous ne pouvez pas utiliser une fonction définie par l'utilisateur pour initialiser la valeur. Il doit être une expression constante
Vous ne peut pas invoquer les fonctions initialisation statique comme ça. Dans votre exemple, vous pouvez simplement utiliser:
Si vous avez un plus compliqué de l'installation, vous aurez besoin de fournir une construction de la bibliothèque et de la bibliothèque de la destruction de la fonction que vous forcez les utilisateurs de votre bibliothèque à l'appel (en supposant que vous souhaitez être portable), ou vous devrez utiliser le C++ et profiter de constructeurs/destructeurs, ou vous aurez à prendre avantage de la non-standard et non-portable __attribute__((constructeur)) pour créer une fonction qui est exécutée au démarrage de l'initialiser.
Si vous avez plus compliqué de l'installation, je vous recommande fortement que vous utilisez C++:
Toutefois, si vous avez besoin de coller avec de la pure C, le portable chose à faire est d'utiliser quelque chose comme:
Pour l'essentiel, dans le ci-dessus, vous initialisez votre bibliothèque avec
mylibrary_init
et le démontage de votre bibliothèque à l'aide demylibrary_destroy
. Les fonctions à l'aide de votre bibliothèque aurait besoin d'un initialisé instance demylibrary_t
et donc la personne qui a créé la fonction principale serait chargé d'invoquermylibrary_init
. Il est également bon de faire de la fonction d'initialisation dépend d'un "attributs" paramètre qui peut être remplacé par 0 ou NULL comme valeur par défaut. De cette façon, si vous prolongez votre bibliothèque et de la nécessité d'accepter les options de configuration, il est disponible pour vous. C'est plus une conception de l'approche technique, mais.Pour les gens curieux qui utilisent aussi MSVC:
En C il est possible d'exécuter l'initialisation des fonctions avant main tout comme il est possible en C++ (bien sûr, il est, comment aurait-C++ le faire si il n'était pas possible en C), mais il peut être un peu déroutant si vous n'avez pas lu comment votre bibliothèque d'exécution des travaux.
Longue histoire courte:
De sorte qu'il n'est pas aussi compact le texte source en C++, mais il peut être fait. Aussi, avant de l'utiliser, je recommande à comprendre le format de PE d'abord, puis de lire crt\src\crt0.c et crt\src\crt0dat.c (recherche de _cinit dans les deux fichiers) dans votre MSVC répertoire d'installation de sorte que vous savez ce qui se passe.
Vous ne pouvez pas appeler une fonction comme initiliazer. Vous avez besoin de l'appeler, à l'intérieur.