Pourquoi ne pouvons-nous pas initialiser les membres à l'intérieur d'une structure?
exemple:
struct s {
int i = 10;
};
Si vous souhaitez initialiser non-statique membres dans struct
déclaration :
En C++ (pas C), structs
sont presque synonymes de classes et peuvent avoir des membres initialisés dans le constructeur.
struct s {
int i;
s(): i(10)
{
}
};
Si vous souhaitez initialiser une instance:
En C ou C++:
struct s {
int i;
};
...
struct s s_instance = { 10 };
C99 possède également une fonctionnalité appelée initialiseurs désignés:
struct s {
int i;
};
...
struct s s_instance = {
.i = 10,
};
Il existe également une extension GNU C très similaire aux initialiseurs désignés par C99, mais il vaut mieux utiliser quelque chose de plus portable:
struct s s_instance = {
i: 10,
};
La réponse directe vient du fait que la définition de la structure déclare un type et non une variable pouvant être initialisée. Votre exemple est:
struct s { int i=10; };
Cela ne déclare aucune variable - cela définit un type. Pour déclarer une variable, vous devez ajouter un nom entre }
et ;
, puis vous l'initialisez ensuite:
struct s { int i; } t = { 10 };
Comme Checkers l’a noté, dans C99, vous pouvez également utiliser des initialiseurs désignés (ce qui constitue une formidable amélioration: un jour, C rattrapera les autres fonctionnalités fournies par Fortran 66 pour l’initialisation des données, répétant principalement les initialiseurs un nombre de fois déterminé). Avec cette structure simple, il n'y a aucun avantage. Si vous avez une structure avec, par exemple, 20 membres et que vous n’avez besoin que d’initialiser l’un d’eux (par exemple, parce que vous avez un drapeau qui indique que le reste de la structure est ou n’est pas initialisée), il est plus utile:
struct s { int i; } t = { .i = 10 };
Cette notation peut également être utilisée pour initialiser des unions, pour choisir quel élément de l'union est initialisé.
Notez qu'en C++ 11, la déclaration suivante est maintenant autorisée:
struct s {
int i = 10;
};
C'est une vieille question, mais elle occupe une place de choix dans Google et pourrait tout aussi bien être clarifiée.
Edit: La question était à l'origine taguée c++
mais l'affiche disait que c'était à propos de c
alors j'ai re-tagué la question, je laisse la réponse cependant ...
En C++, une struct
est simplement une class
qui est définie par défaut pour public
plutôt que private
pour les membres et l'héritage.
C++ n'autorise que les membres static const
intégraux à être initialisés en ligne, les autres membres doivent être initialisés dans le constructeur ou si struct
est un POD dans une liste d'initialisation (lors de la déclaration de la variable).
struct bad {
static int answer = 42; // Error! not const
const char* question = "what is life?"; // Error! not const or integral
};
struct good {
static const int answer = 42; // OK
const char* question;
good()
: question("what is life?") // initialization list
{ }
};
struct pod { // plain old data
int answer;
const char* question;
};
pod p = { 42, "what is life?" };
Nous ne pouvons pas initialiser parce que lorsque nous déclarons une structure autre que ce que nous faisons, il suffit d’informer le compilateur de leur présence, c’est-à-dire qu’aucune mémoire n’est allouée pour cela et si nous initialisons le membre sans mémoire pour cela. Normalement, ce qui se passe lorsque nous initialisons une variable qui dépend de l’endroit où nous avons déclaré une variable, le compilateur alloue de la mémoire pour cette variable.
int a = 10;
Donc, quelle mémoire est nécessaire pour conserver ces données, mais en cas de structure, il n’ya pas de mémoire, il n’est donc pas possible de l’initialiser.
Comme vous l'avez dit, c'est juste un membre et non une variable. Lorsque vous déclarez une variable, le compilateur fournit également un espace mémoire pour les variables dans lesquelles vous pouvez saisir des valeurs. Si le compilateur ne donne pas d'espace mémoire à un membre de la structure, vous ne pouvez donc pas affecter de valeurs aux membres de la structure à moins de créer une variable de ce type.