2014-09-28 4 views
0

기본적인 접근법 구조체 초기화 :정적 제로

struct TEST 
{ 
    float c; 
    unsigned int c1; 
    double c2[5]; 
} t = {0}; 

경고를 준다 :

경고 '구조체 TEST'[-Wmissing 필드 - 초기화 필드 'C1'에 대한 이니셜 누락 ]

길고, 숯 (그러나 어레이) 등을 int로 설정 중에 C ...

#define ADD_STRUCT_TO_ARRAY(xu) X(xu, &(struct xu){})SEP 

이다 I 이런 다음 줄이 :

경고 : 이니셜 주위 중괄호 누락 [-Wmissing-괄호]

이었다 어레이는 경고를 준다 구조체가 여러 위치에서 초기화되어야하기 때문에 필요합니다.

경고 : 필드 초기화 누락이 '구조체 A'의 'A1'은 [-Wmissing 필드가-초기화] C99 표준에 의해

가 제로로 초기화해야하지만 나에게 경고를 제공 경고를 없애시겠습니까?

#define ADD_STRUCT_TO_ARRAY(xu) X(xu, &(struct xu){0})SEP 

에 변화가 거의 경고 제거하지만 구조체의 첫 번째 요소는 부동 또는 더블입니다하지 않을 경우.

도 0.0 설정?, 무슨 일이 일어나고 있는지 어떤 생각

+0

그래서 X와 SEP은 무엇인가요? 그리고 거의 경고하지 않는 점은 무엇입니까? – BonzaiThePenguin

+0

명확한 example.X 및 SEP로 편집하면 쉽게 무시할 수있는 매크로입니다. – Lesto

+0

감사합니다. 편집 한 예가 실제로 훨씬 명확합니다. – BonzaiThePenguin

답변

0

{}가 결정적으로 C에서 유효한 초기화, 당신이 볼 따라서 최초의 경고하지 않습니다 도움이되지 보인다. (C++에서는 유효하지만 여기에서 사용되는 "복합 리터럴"의 구조는 그렇지 않습니다.)

이제 초기화 코드가 하나 이상 있으면 C입니다. 경고 플래그가 많은 경우 일부 컴파일러에서 추가 진단 기능을 제공합니다. 당신이 여기에있는 경우, 이들은 단지 성가신 일입니다. { 0 }이며 C 표준에 의해 예측 된대로 기본 초기화 장치가입니다. 나는 다른 특별한 쉬운 방법이 없다면 그 특별한 경고 (missing-field-initializers)를 끄면된다.

+0

님이 질문을 수정했습니다. 그래서 나는 그 주위에 경고를하지 않아야한다. – Lesto

+0

하지만 여전히 안전하고 표준 사용하는 경우 경고하는 이유는 무엇입니까? – Lesto

+0

예, 사용하는 것이 안전합니다. C 표준은 언급되지 않은 모든 필드가 '0'으로 초기화되도록하고, 원한다면 명시 적으로'{}'의 레벨을 생략 할 수 있다고 예견합니다. –