C y C++:inicialización parcial de la estructura automática

C y C++:inicialización parcial de la estructura automática


Por ejemplo, si somestruct tiene tres miembros enteros, siempre había pensado que estaba bien hacer esto en la función C (o C++):


somestruct s = {123,};

El primer miembro se inicializaría en 123 y los dos últimos se inicializarían en 0. A menudo hago lo mismo con matrices automáticas, escribiendo int arr[100] = {0,}; para que todos los enteros en una matriz se inicialicen a cero.




Recientemente leí en el Manual de referencia de GNU C que:





¿Puede alguien decirme qué dicen los estándares C y C++ con respecto a la estructura automática parcial y la inicialización automática de arreglos? Hago el código anterior en Visual Studio sin ningún problema, pero quiero que sea compatible con gcc/g++, y tal vez también con otros compiladores. Gracias


Respuestas:


La documentación de gcc vinculada no habla de Inicialización parcial solo habla de inicialización (completa) o Sin inicialización .



Los estándares no definen la inicialización parcial de los objetos, ya sea inicialización completa o no inicialización. La inicialización parcial es una terminología no estándar que comúnmente se refiere a una situación en la que proporciona algunos inicializadores pero no todos, es decir:menos inicializadores que el tamaño de la matriz o la cantidad de elementos de estructura que se inicializan.


Ejemplo:


int array[10] = {1,2};                    //Case 1:Partial Initialization


La inicialización significa proporcionar algún valor inicial a la variable que se crea al mismo tiempo que se crea. es decir:en la misma instrucción de código.


Ejemplo:


int array[10] = {0,1,2,3,4,5,6,7,8,9};    //Case 2:Complete Initialization
int array[10]; //Case 3:No Initialization

El párrafo citado describe el comportamiento de Case 3 .


Las reglas relativas a la inicialización parcial (Case 1 ) están bien definidos por el estándar y estas reglas no dependen del tipo de almacenamiento de la variable que se inicializa.

AFAIK, todos los principales compiladores tienen un 100 % de cumplimiento de estas reglas.




Los estándares C y C++ garantizan que incluso si una matriz de enteros se encuentra en almacenamiento automático y si hay menos inicializadores en una lista entre llaves, los elementos no inicializados deben ser inicializado a 0 .


C99 Estándar 6.7.8.21




En C++ las reglas se establecen con una pequeña diferencia.


C++03 Estándar 8.5.1 Agregados

Párrafo 7:



Si bien la Inicialización de valor se define en,

C++03 8.5 Inicializadores

Párrafo 5: