2011-01-13 16 views
12

escribo una estructura¿Cómo inicializar una variable const dentro de una estructura en C?

struct Tree{ 
    struct Node *root; 
    struct Node NIL_t; 
    struct Node * const NIL; //sentinel 
} 

Quiero

struct Node * const NIL = &NIL_t; 

no puedo inicializar el interior de la estructura. Estoy usando msvs.

Uso C, NO C++. Sé que puedo usar la lista de inicialización en C++.

¿Cómo hacerlo en C?

+2

Por curiosidad, ¿por qué necesita tanto un valor para NIL_t como un puntero a NIL? Eso parece un poco redundante. Independientemente, esta es una pregunta interesante! – templatetypedef

+0

Correcto. No estás usando C++, por lo que no puedes hacer esto. –

Respuesta

21

Si está utilizando C99, que se puede utilizar para hacer esto inicializadores designados:

struct Tree t = { .root = NULL, .NIL = &t.NIL_t }; 

Esto sólo funciona en C99, sin embargo. He probado esto en gcc y parece funcionar bien.

+1

+1 esto realmente haría una buena macro: '#define TreeDecl (id, rt) struct Árbol id = {.root = rt, .NIL = & id.NIL_t}' –

+4

En C89 puedes hacer 'struct Tree t = {NULL, {0}, & t.NIL_t}; 'siempre que 0 sea un inicializador válido para el primer campo en un Nodo struct. –

+0

O, siguiendo el comentario de @Chris Dodd, puede reorganizar la estructura para que el miembro 'NIL' venga antes del miembro' NIL_t', luego use 'struct Tree t = {NULL, & t.NIL_t};' – caf

1

Una estructura define una plantilla de datos pero no tiene datos. Como no tiene datos, no hay forma de inicializarlo.

Por otro lado, si desea declarar una instancia, puede inicializarla.

struct Tree t = { NULL, NULL, NULL }; 
+1

'NIL_t' es un' struct Node', no un 'struct Node *', por lo que probablemente no se inicialice como 'NULL'. También recomendaría hacer una función 'struct Tree * init (...)' (o una función 'void init (struct Tree * t, ...)' si lo prefieres, o una macro) para hacer este tipo de trabajo para ti. –

+0

@Chris: Correcto. Debe haberse perdido eso. Supongo que probablemente solo puedas asignar una estructura a otra estructura después de que ambas hayan sido declaradas. –

+0

@Jonathan - Para 'struct's anidados, podría usar' struct Tree t = {NULL, {/ * struct Node contents here * /}, NULL} '(o' & t.NIL_t' para el último) –

0

Tal vez algo como esto será suficiente?

struct { 
    struct Node * const NIL; 
    struct Node *root; 
    struct Node NIL_t; 
} Tree = {&Tree.NIL_t}; 
Cuestiones relacionadas