2011-01-13 23 views
12

napisać structJak zainicjować zmienną stałą wewnątrz struktury w C?

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

Chcę

struct Node * const NIL = &NIL_t; 

Nie mogę zainicjować go wewnątrz struktury. Używam msvs.

Używam C, NIE C++. Wiem, że mogę używać listy inicjalizacji w C++.

Jak to zrobić w C?

+2

Z ciekawości, dlaczego potrzebna jest zarówno wartość NIL_t, jak i wskaźnik do NIL? To wydaje się nieco zbędne. Niezależnie, jest to interesujące pytanie! – templatetypedef

+0

Prawidłowo. Nie używasz C++, dlatego nie możesz tego zrobić. –

Odpowiedz

21

Jeśli używasz C99 można używane wyznaczony inicjatorów Aby to zrobić:

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

Działa tylko w C99, choć. Przetestowałem to na gcc i wygląda na to, że działa dobrze.

+1

+1 to rzeczywiście dałoby dobre makro: '#define TreeDecl (id, rt) struct Tree id = {.root = rt, .NIL = & id.NIL_t}' –

+4

W C89 możesz zrobić 'struct Tree t = {NULL, {0}, i t.NIL_t}; 'o ile 0 jest poprawnym inicjatorem dla pierwszego pola w węźle struktury. –

+0

Lub, po komentarzu @Chris Dodd, możesz zmienić strukturę struct tak, aby członek 'NIL' znalazł się przed elementem' NIL_t', następnie użyj 'struct Tree t = {NULL, & t.NIL_t};' – caf

1

Struktura definiuje szablon danych, ale nie zawiera żadnych danych. Ponieważ nie ma danych, nie można go zainicjować.

Z drugiej strony, jeśli chcesz zadeklarować instancję, możesz ją zainicjować.

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

'NIL_t' to' węzeł struktury ', a nie 'struct Node *', więc prawdopodobnie nie zostanie zainicjowany jako 'NULL'. Polecam również wykonanie funkcji 'struct Tree * init (...)' (lub funkcji 'void init (struct Tree * t, ...)', jeśli wolisz, lub makra) do wykonania tego rodzaju praca dla Ciebie. –

+0

@Chris: Prawo jesteś. Tęskniłem za tym. Sądzę, że prawdopodobnie można przypisać strukturę do innej struktury po zadeklarowaniu obu. –

+0

@ Jonathan - Dla zagnieżdżonych 'struct's możesz użyć' struct Tree t = {NULL, {/ * struct Node contents here * /}, NULL} '(lub' & t.NIL_t' dla ostatniego). –

0

Może coś takiego wystarczy?

struct { 
    struct Node * const NIL; 
    struct Node *root; 
    struct Node NIL_t; 
} Tree = {&Tree.NIL_t}; 
Powiązane problemy