6

supongamos que tenemos dos unidades de compilación de la siguiente manera:¿Este código produce un comportamiento indefinido o simplemente es un comportamiento no especificado?

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

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

Cuando lo probé en VC2010, inicializa value1 y value2 a cero en primer lugar. no están ambos value1 y value2 inicializados dinámicamente y la inicialización predeterminada no se aplica en ellos?

Gracias,

Respuesta

8

3.6.2/1 dice que "Objetos con una duración de almacenamiento estático (3.7.1) se inicializará en cero (8.5) antes de que se lleve a cabo cualquier otra inicialización ".

Así que tienes razón, no están inicializados por defecto. Pero tienen cero inicialización, que de hecho para int es lo mismo. Para un tipo de clase no es necesariamente lo mismo.

Dicho esto, no prometo que el comportamiento aquí es simplemente que el orden de inicialización no está especificado, y de ahí que una variable termine en 10 y la otra 20, pero no especificada, cuál es cuál. Puede ser indefinido por otros motivos, pero no puedo pensar en ninguno.

3

Cada variable global es de primera inicializado a cero, antes de que ocurran cada otras inicializaciones.
Este comportamiento se describe bajo 3.6.2 [basic.start.init]/2:

variables con duración de almacenamiento estático o duración de almacenamiento de hilo será inicializado a cero antes de cualquier otro de inicialización se lleva a cabo.

(Esto es de la C++ 0x FDIS, pero creo que el estándar de C++ 98 dice lo mismo.)

Cuestiones relacionadas