Domanda

Diciamo che abbiamo due unità di compilation come segue:

// a.cpp
extern int value2;
int value1 = value2 + 10;

// b.cpp
extern int value1;
int value2 = value1 + 10;

Quando l'ho provato su VC2010, inizializza value1 e value2 a zero prima. non sono entrambi value1 e value2 L'inizializzazione inizializzata e predefinita non si applica su di essi?

Grazie,

È stato utile?

Soluzione

3.6.2/1 afferma che "gli oggetti con durata di archiviazione statica (3.7.1) devono essere inizializzati zero (8.5) prima che si svolgesse qualsiasi altra inizializzazione".

Quindi hai ragione, non sono inizializzati predefiniti. Ma sono zero-inizializzati, che in realtà per int è la stessa cosa. Per un tipo di classe non è necessariamente la stessa cosa.

Detto questo, non prometto che il comportamento qui sia semplicemente che l'ordine di inizializzazione non è specificato, e quindi che una variabile finisce come 10 e l'altra 20, ma non specificata che è quale. Potrebbe essere indefinito per altri motivi, ma non riesco a pensare a nessuno.

Altri suggerimenti

Ogni variabile globale viene prima inizializzata zero, prima che si verifichino ogni altre inizializzazioni.
Questo comportamento è descritto sotto 3.6.2 [basic.start.init] / 2:

Le variabili con durata di archiviazione statica o durata di archiviazione del thread devono essere inizializzate zero prima che si verifichi qualsiasi altra inizializzazione.

(Questo è dagli FDI C ++ 0x, ma credo che lo standard C ++ 98 dica lo stesso.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top