2008-12-12 27 views
5

que tienen una estructura que contiene una series de otra estructura, se ve algo como esto:estructuras anidadas/matrices de inicialización


typedef struct bla Bla; 
typedef struct point Point; 

struct point 
{ 
    int x, y; 
}; 

struct bla 
{ 
    int another_var; 
    Point *foo; 
}; 

ahora quiero inicializarlas en el ámbito global. Tienen la intención de ser una descripción de un módulo. Traté de hacer lo mismo con los literales compuestos c99, pero el compilador (gcc) no me gustó:


Bla test = 
{ 
    0, (Point[]) {(Point){1, 2}, (Point){3, 4}} 
}; 

consigo los siguientes errores:

 
error: initializer element is not constant 
error: (near initialization for 'test') 

Ya que no es necesario modificar puedo poner tantos "const" como sea necesario. ¿Hay alguna manera de compilarlo?

Respuesta

5

No es necesario un compuesto literal para cada elemento, basta con crear una matriz literal solo compuesto:

Bla test = 
{ 
    0, (Point[]) {{1, 2}, {3, 4}} 
}; 

Asegúrese de que se compila con -std=c99.

+0

¿Eso asigna dinámicamente la memoria para los dos puntos? – aib

+0

@aib: Sí, crea una matriz de dos estructuras de "punto" literales (con duración de almacenamiento estático ya que está en el alcance del archivo) e inicializa el miembro "foo" de "prueba" para que apunte a ellas. Es un atajo que es equivalente a definir una matriz por separado y asignar al miembro "foo" para que apunte a ella. –