¿Inicia la inicialización del lenguaje de progtwigción C / C ++?

Podría hacer una inicialización de estructura con código:

struct struct_type_id struct_name_id = { value1, value2, value3 }; 

pero no pudo con:

 struct struct_type_id struct_name_id; struct_name_id = { value1, value2, value3 }; 

¿Por qué podría hacerlo con el primero, pero no con el último con gcc, g ++, vc2008, vc6? En otras palabras, ¿por qué el lenguaje de progtwigción c / c ++ no admite esta syntax?

Gracias.

La primera statement crea una variable inicializada a los valores dados, es decir, estos valores se construyen en la memoria y se almacenan directamente en el progtwig ejecutable en esa dirección de variable (para globales) o listos para la copia de memoria (para variables de la stack).

La segunda statement del segundo bloque es muy diferente. Aunque parece similar, es una expresión de asignación. Significa que el RHS del operador igual es una expresión que se evalúa (independientemente de lo que está en el LHS de =), y luego se pasa al operador =. Sin el contexto adecuado, {...} no tiene ningún significado.

En C99, puedes hacer esto:

 struct_name_id = (struct struct_type_id){ value1, value2, value3 }; 

Ahora el operador RHS of the equals es una expresión válida, ya que existe un contexto adecuado para que el comstackdor sepa qué hay en {...} .

En C ++ 11, la syntax es:

 struct_name_id = struct_type_id{ value1, value2, value3 }; 

No sé por qué C originalmente no admitía algún tipo de syntax para ‘reinicializar’ una estructura usando algo así como la lista de inicializadores; definitivamente hay momentos en los que lo habría encontrado útil. Como mencionó Juliano , C99 (y C ++ 0x) lo han corregido hasta cierto punto, pero a menudo me tengo que quedar con C90. Cuando quiero hacer algo así, a veces hago lo siguiente:

 struct foo const init_foo = { 1, 2, 3}; struct foo myFoo; // .... myFoo = init_foo; // reinitialize myFoo 

Solo necesitas lanzar los valores como tales:

 struct_name_id = (struct struct_type_id){ value1, value2, value3 }; 

Me enfrenté a un problema similar, y la solución a eso fue que estaba tratando de inicializar la estructura fuera de la función (no usando la syntax del inicializador, pero con la notación obj.member = VALUE;). Es un problema relacionado, por lo que publicar aquí, esperando que alguien con la misma pregunta aterrice aquí.

Funcionara para ti ?

 typedef struct name_id {int value1; int value2; int value3;} NAME_ID; name_id mynameid = {0,1,2};