web-dev-qa-db-fra.com

Pourquoi ne pouvons-nous pas initialiser les membres à l'intérieur d'une structure?

Pourquoi ne pouvons-nous pas initialiser les membres à l'intérieur d'une structure?

exemple:

struct s {
   int i = 10;
};
44
Santhosh

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,
};
38
Alex B

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é.

33
Jonathan Leffler

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.

12
Turtlesoft

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?" };
8
Motti

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;
  • si c'est automatique que dans la mémoire de pile va allouer 
  • si elle est globale que dans la mémoire des sections de données va allouer

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.

2
Anup Raj Dubey

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.

0
Ajay Sivan