2010-01-29 2 views
2

모든 필드를 정의하지 않고 중첩 된 구조를 초기화하면 다음과로 정의 내가 구조체의 세트가

typedef struct 
{ 
    int index; 
    int array[10]; 
} 
Item; 

typedef struct 
{ 
    Item A; 
    Item B; 
    Item C; 
} 
Collection; 

다음과 같이 I 형 Collection의 변수를 선언 할 :

Collection collection = 
{ 
    { 1, 0 }, /* item A */ 
    { 2, 0 }, /* item B */ 
    { 3, 0 } /* item C */ 
}; 

윌이 세 개의 index 변수를 1, 2 및 3으로 설정하고 동시에 세 개의 변수를 모두 0으로 초기화하십시오.

내 컴파일러에서 작동하는 것처럼 보입니다. 그러나 이것이 표준 동작인지 알고 싶습니다.

답변

4

이것은 표준과 호환됩니다. 6.7.8 초기화를 참조하십시오. 또한 C99 준수 컴파일러에서 지정된 이니셜 라이저를 사용할 수 있습니다.

+0

정말 멋집니다. 나는 오늘까지 지정된 초기화 장치에 대해 들어 본 적이 없었다! –

7

그들 유효한 배열 이니셜 라이저를 만들기 위해 제로 주변에 추가 중괄호가 있어야한다 : 그 외에도이 제대로 구조를 초기화하는 것을에서

Collection collection = 
{ 
    { 1, {0} }, /* item A */ 
    { 2, {0} }, /* item B */ 
    { 3, {0} } /* item C */ 
}; 

.

inizializer는 추가 중괄호 없이도 유효하지만 컴파일러 경고가 표시되며 하위 집합에 대한 초기화 프로그램이 명시 적으로 만들어지면 혼동이 줄어 듭니다. 세부 사항은 6.7.8 절 (20)과 6.7.8 절 (29)에있는 그의 대답에서 dirkgently 언급 한 C99 표준의 6.7.8 절을 보라.

+0

질문에 거의 대답하지 않지만 절대적으로 유효한 관찰입니다. 어쨌든 +1 – qrdl

+1

+1. 나는 괄호가 없어도 "불완전하지만 일관되게 괄호가 붙은 초기화"라고 알려진 것을 가지고 있다고 생각합니다. – dirkgently

+0

@qrdl : "올바른 방법입니다."라는 질문을 읽었지만 올바른 생각입니다. 구조를 올바르게 초기화한다는 또 다른 행을 추가했습니다. – sth

관련 문제