2011-01-13 2 views
12

나는 내가 구조체 내부를 초기화 할 수 없습니다C에서 struct 내부의 const 변수를 초기화하는 방법은 무엇입니까?

struct Node * const NIL = &NIL_t; 

을 원하는 구조체

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

물품. msvs를 사용하고 있습니다.

C가 아니라 C++을 사용합니다. C++에서 초기화 목록을 사용할 수 있다는 것을 알고 있습니다.

C에서 그렇게하는 방법?

+2

왜 호기심에서 NIL_t에 대한 값과 NIL에 대한 포인터가 모두 필요합니까? 그건 약간 중복 된 것 같습니다. 독립적으로 이것은 흥미로운 질문입니다! – templatetypedef

+0

수정. 당신은 C++을 사용하지 않기 때문에 이것을 할 수 없습니다. –

답변

21

당신이 C99을 사용하는 경우는, 당신은이 작업을 수행하는 초기화를 지정 사용 할 수 있습니다. 나는 gcc에서 이것을 테스트했으며 잘 작동하는 것 같다.

+1

+1 이것은 실제로 좋은 매크로를 만들 것이다 :'#define TreeDecl (id, rt) struct tree id = {.root = rt, .NIL = & id.NIL_t}' –

+4

C89에서'struct tree t = {NULL, {0}, & t.NIL_t};'0은 struct 노드의 첫 번째 필드에 대한 유효한 초기화 프로그램입니다. –

+0

또는 @Chris Dodd의 설명에 이어, 구조체를 재정렬하여'NIL' 멤버가 NIL_t 멤버보다 먼저 나온 다음'struct Tree t = {NULL, & t.NIL_t};를 사용하십시오. – caf

1

구조체는 데이터 템플릿을 정의하지만 데이터 자체는 없습니다. 데이터가 없기 때문에 데이터를 초기화 할 방법이 없습니다.

반면에 인스턴스를 선언하려면 인스턴스를 초기화 할 수 있습니다. 하지만, C99에서

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

이 유일한 작품 :

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

'NIL_t'는'struct Node * '가 아니라'struct Node'입니다. 따라서 아마도'NULL'으로 초기화되지 않을 것입니다. 원한다면'struct Tree * init (...)'함수 (또는'void init (struct Tree * t, ...)'함수 또는 매크로)를 만들 것을 권장합니다. 당신을 위해 일합니다. –

+0

@Chris : 맞습니다. 그걸 놓쳤을거야. 아마도 두 구조체를 선언 한 후에 구조체를 다른 구조체에 할당 할 수있을 것입니다. –

+0

@Jonathan - 중첩 된'struct's에 대해'struct tree t = {NULL, {/ * 구조체 노드 내용은 여기에 * /}, NULL}'을 사용할 수 있습니다 (마지막 하나는'& t.NIL_t'). –

0

아마도 이런 식으로 충분할까요?

struct { 
    struct Node * const NIL; 
    struct Node *root; 
    struct Node NIL_t; 
} Tree = {&Tree.NIL_t}; 
관련 문제