Hvorfor kan vi ikke initialisere medlemmer inne i en struktur?

stemmer
44

Hvorfor kan vi ikke initialisere medlemmer inne i en struktur?

eksempel:

struct s {
   int i = 10;
};
Publisert på 22/10/2008 klokken 10:01
kilden bruker
På andre språk...                            


6 svar

stemmer
35

Hvis du ønsker å initialisere ikke-statiske medlemmer i struct erklæringen :

I C ++ (ikke C), structser nesten synonymt med klasser og kan ha medlemmer initialisert i konstruktøren.

struct s {
    int i;

    s(): i(10)
    {
    }
};

Hvis du ønsker å initialisere en forekomst :

I C eller C ++:

struct s {
    int i;
};

...

struct s s_instance = { 10 };

C99 har også en funksjon som kalles utpekte initializers:

struct s {
    int i;
};

...

struct s s_instance = {
    .i = 10,
};

Det er også en GNU C forlengelse som er svært lik C99 utpekte initializers, men det er bedre å bruke noe mer portable:

struct s s_instance = {
    i: 10,
};
Svarte 22/10/2008 kl. 10:03
kilden bruker

stemmer
32

Den direkte Svaret er fordi strukturen definisjonen erklærer en type og ikke en variabel som kan initialisert. Ditt eksempel er:

struct s { int i=10; };

Dette betyr ikke erklære noe variabel - den definerer en type. Å erklære en variabel, vil du legge til et navn mellom }og ;, og så ville du initialisere det etterpå:

struct s { int i; } t = { 10 };

Som Checkers bemerket i C99, kan du også bruke utpekt initializers (som er en fantastisk forbedring - en dag, vil C fange opp med de andre funksjonene som Fortran 66 hadde for data initialisering, primært gjenta initializers et spesifiseres antall ganger). Med denne enkle struktur, det er ingen fordel. Hvis du har en struktur med, si, 20 medlemmer og bare trengte å initialisere en av dem (for eksempel fordi du har et flagg som indikerer at resten av strukturen er, eller ikke er, initialisert), er det mer nyttig:

struct s { int i; } t = { .i = 10 };

Denne notasjon kan også brukes til å initial fagforeninger, å velge hvilken del av unionen er initialisert.

Svarte 22/10/2008 kl. 15:14
kilden bruker

stemmer
9

Merk at i C ++ 11, er følgende erklæring nå tillatt:

struct s {
   int i = 10;
};

Dette er en gammel spørsmålet, men det rangerer høyt i Google og kan like godt være avklart.

Svarte 31/05/2016 kl. 16:12
kilden bruker

stemmer
8

Edit: Spørsmålet ble opprinnelig merket c++, men plakaten sa det er om cså jeg re-merket på spørsmålet, jeg drar svaret selv ...

I C ++ en structer bare noen classhvilke standarder for publici stedet privatefor medlemmer og arv.

C ++ tillater bare static constintegrert medlemmer kan initialiseres inline, må andre medlemmer initialiseres i konstruktør, eller hvis det structer en POD i en initialisering listen (ved deklarasjon av den 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?" };
Svarte 22/10/2008 kl. 10:05
kilden bruker

stemmer
2

Vi kan ikke initialiseres fordi når vi erklært noen struktur enn faktisk hva vi gjør, bare informere kompilatoren om deres tilstedeværelse dvs. ingen minne som er tildelt for det, og hvis vi initial medlem uten minne for det. Normalt hva som skjer når vi initial noen variabel som avhenger av stedet hvor vi erklært variabel kompilator allokere minne for denne variabelen.

int a = 10;
  • hvis det er auto enn i bunken minne kommer til å fordele
  • hvis det er global enn i data deler minne kommer til å fordele

Så hva minne er nødvendig for å holde disse dataene, men i tilfelle av struktur ingen hukommelse er det så ikke mulig å initialisere den.

Svarte 14/03/2016 kl. 18:14
kilden bruker

stemmer
0

Som du sa det er bare et medlem ikke en variabel. Når du deklarerer en variabel kompilatoren vil også gi minneplass for de variablene hvor du kan sette verdier. I tilfelle en av en struct medlem kompilatoren ikke gir plass i minnet for det, slik at du ikke kan tilordne verdier til konstruere medlemmer, med mindre du oppretter en variabel av at struct type.

Svarte 31/05/2016 kl. 16:26
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more