2011-01-13 45 views
12

tôi viết một structLàm thế nào để khởi tạo một biến const bên trong một struct trong C?

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

Tôi muốn

struct Node * const NIL = &NIL_t; 

tôi không thể khởi tạo nó bên trong các cấu trúc. Tôi đang sử dụng msvs.

Tôi sử dụng C, KHÔNG C++. Tôi biết tôi có thể sử dụng danh sách khởi tạo trong C++.

Làm như thế nào trong C?

+2

Vì tò mò, tại sao bạn cần cả giá trị cho NIL_t và con trỏ tới NIL? Điều đó có vẻ hơi dư thừa. Độc lập, đây là một câu hỏi thú vị! – templatetypedef

+0

Chính xác. Bạn không sử dụng C++, đó là lý do tại sao bạn không thể làm điều này. –

Trả lời

21

Nếu bạn đang sử dụng C99, bạn có thể được sử dụng để làm điều này initializers định:

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

chỉ này hoạt động trong C99, mặc dù. Tôi đã thử nghiệm này trên gcc và có vẻ như làm việc tốt.

+1

+1 điều này thực sự sẽ tạo ra một macro tốt: '#define TreeDecl (id, rt) struct Cây id = {.root = rt, .NIL = & id.NIL_t}' –

+4

Trong C89 bạn có thể làm 'struct Tree t = {NULL, {0}, & t.NIL_t}; 'miễn là 0 là một khởi tạo hợp lệ cho trường đầu tiên trong một nút cấu trúc. –

+0

Hoặc, theo nhận xét của @Chris Dodd, bạn có thể sắp xếp lại cấu trúc để thành viên 'NIL' đến trước thành viên' NIL_t', sau đó sử dụng 'struct Tree t = {NULL, & t.NIL_t};' – caf

1

Cấu trúc xác định mẫu dữ liệu nhưng không có dữ liệu. Vì nó không có dữ liệu nên không có cách nào để khởi tạo nó.

Mặt khác, nếu bạn muốn khai báo một cá thể, bạn có thể khởi tạo phiên bản đó.

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

'NIL_t' là một' struct Node', không phải là 'struct Node *', vì vậy nó có thể sẽ không được khởi tạo là 'NULL'. Tôi cũng khuyên bạn nên tạo một hàm 'struct Tree * init (...)' (hoặc một hàm 'void init (struct Tree * t, ...)' nếu bạn thích, hoặc một macro) để làm kiểu này làm việc cho bạn. –

+0

@Chris: Đúng vậy. Phải bỏ lỡ điều đó. Tôi đoán bạn có thể chỉ có thể gán một cấu trúc cho một cấu trúc khác sau khi cả hai đã được khai báo. –

+0

@Jonathan - Đối với 'struct' bạn có thể sử dụng 'struct Tree t = {NULL, {/ * struct Node nội dung ở đây * /}, NULL}' (hoặc '& t.NIL_t' cho cái cuối cùng.) –

0

Có thể một cái gì đó như thế này sẽ đủ?

struct { 
    struct Node * const NIL; 
    struct Node *root; 
    struct Node NIL_t; 
} Tree = {&Tree.NIL_t}; 
Các vấn đề liên quan