2009-11-10 11 views
10

pude hacer la inicialización estructura con código:¿Inicia la inicialización del lenguaje de programación C/C++?

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 }; 

razón por la que podría hacerlo con el primero, pero no pudo con el último con gcc, g ++, VC2008 , vc6? En otras palabras, ¿por qué el lenguaje de programación c/C++ no admite esta sintaxis?

gracias.

+3

¿Dónde puedo obtener más información sobre este lenguaje de programación C/C++? ¿Tiene una página web? –

Respuesta

22

La primera sentencia crea una variable inicializado a los valores dados, es decir, estos valores se construyen en la memoria y se almacenan directamente en el programa ejecutable en ese dirección de variable (para globales) o lista para copiar memoria (para variables de pila).

La segunda declaración 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, usted puede hacer esto:

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

Ahora el lado derecho del operador de igualdad es una expresión válida, ya que hay un contexto adecuado para el compilador para saber lo que está en {...}.

En C++ 11, la sintaxis es:

struct_name_id = struct_type_id{ value1, value2, value3 }; 
+0

@Juliano: C89 también admite este tipo de sintaxis de conversión a gcc. – Jichao

+2

@jcyang: GCC podría permitir esa sintaxis, pero no es C89/C90 (es una extensión de GCC). Por ejemplo, MSVC, Digital Mars y Comeau no (a menos que active el soporte C99 en Comeau) admiten esa sintaxis. –

+0

@michael: pero utilicé el modificador --std = c89 – Jichao

2

Sólo tiene que emitir los valores como tales:

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

No sé por qué C no apoyó inicialmente algún tipo de sintaxis para 'Fecha' una estructura usando algo así como la lista de inicialización - definitivamente hay momentos en que lo hubiera encontrado útil. Como Juliano mentioned, C99 (y C++ 0x) lo ha arreglado en cierto grado, pero a menudo tengo que seguir 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 
0

¿Funcionará así?

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

@FractalSpace: No podría funcionar. Solo define un alias para la estructura name_id pero no lo hace cambia cualquier otra cosa. – Jichao

0

I se enfrentaron a un problema similar, y la solución a que era que yo estaba tratando de inicializado el struct fuera de la función (no utilizando la sintaxis inicializador, pero con la obj.member = valor; notación). Es un problema relacionado, por lo que publicar aquí, esperando que alguien con la misma pregunta aterrice aquí.

Cuestiones relacionadas