2016-07-19 4 views
-5

C로 이니셜 라이저 목록을 어떻게 만듭니 까? 구조체 또는 공용체를 사용해야합니까?C로 이니셜 라이저 목록 만들기

현재 내가 갖고있는 초기화 된 변수의 수에 문제가있는 코드를 작성했기 때문에.

컴파일 오류 : 초기화의 번호 수

+3

코드를 공유 할 수 있습니까 –

+2

[최소, 완전하고 검증 가능한 예제]로 업데이트하십시오 (http : // stackoverflow/help/mcve)를 사용하십시오. 그렇지 않으면 문제가 무엇인지 정확히 알 길이 없습니다. – dbush

답변

1
struct S 
{ 
    int a, d, p; 
}; 

#define S_INITIALIZER { 12, 10, 77 } 

struct S s = S_INITIALIZER; 

당신은 (일반적으로) 각 멤버의 값을 제공보다 클 수 없습니다. 적은 것을 제공하면 나머지 멤버는 0으로 초기화됩니다 (C99, 6.7.8.21). 더 많이 제공하면 컴파일러 경고가 표시되고 추가 이니셜 라이저 값은 무시됩니다.

편집 : (! 감사) 올라프가 지적한 바와 같이,이 지정된 이니셜 라이저를 사용하는 것이 좋습니다 :

struct S 
{ 
    int d, a, o, p; 
    //  ^new value; a and d inverted! 
}; 
:

#define S_INITIALIZER { .a = 12, .d = 10, .p = 77 } 

이 방법을, 이니셜 라이저는와 관련된 구조체의 변화에 ​​대한 강력

은 여전히 ​​이전과 같이 초기화되며, o는 0으로 초기화됩니다 (C99 6.7.8.19). p을 삭제하면 적어도 gcc에서 컴파일 오류 –가 발생합니다. 사실

, 표준 상태 :

If a designator has the form
   . identifier
then the current object (defined below) shall have structure or union type and the identifier shall be the name of a member of that type.

(C99 6.7.8.7). 그러나 그렇게하지 않으면 어떻게 될지 찾지 못했습니다. 마찬가지로

:

No initializer shall attempt to provide a value for an object not contained within the entity being initialized.

(C99 6.7.8.2), 그렇지 않은 경우 하 (기타 요소를 제공), 다시없는 단어. 추가 요소를 파기하는 것은 합법적 인 것으로 보이지만 컴파일하지 않으면 불법이 아닌 것 같습니다 ...

+0

그 아주 좋은 C 답변 :) (좋은 지점, 건배) –

+0

'더 제공하면 코드가 컴파일되지 않습니다'... 당신이 뭔가를 인용 할 수 있습니까? –

+0

[compile] (http://ideone.com/6cHXUV), 나는 동의하지만 경고는 무시되어서는 안된다. '컴파일되지 않을 것'은 과장이다. –

관련 문제