2013-05-01 3 views
3
#include <stdio.h> 
#include <string.h> 

typedef struct STest 
{ 
    unsigned int uiRoll; 
    unsigned short usiVal; 
} TTest; 

int main() 
{ 
    TTest oTest = {0}; /* Initialize the Values with 0 */ 
    printf("The values are: %d, %d\n", oTest.uiRoll, oTest.usiVal); 
    return 0; 
} 

관측 :GCC "-Wextra"옵션으로 컴파일 할 때 경고를 생성하지 않고 C 구조체를 초기화하는 방법은 무엇입니까?

  1. gcc -Wextra -o a aa.cpp
  2. 얻기 경고와 함께 컴파일 : warning: missing initializer for member STest::usiVal
  3. 또한 memset 함수 기능을하지만 여전히 같은 경고를 받고 함께했습니다.
  4. 첫 번째 구조 요소에 대한 경고 메시지가 없습니다.

어떻게 구조를 초기화 할 수 있습니까? 경고 메시지가 표시되지 않도록하십시오.

+0

'-Wno-missing-field-initializers'와 함께? –

+3

gcc x.c' OR'g ++ x.cpp'는 많은 메시지를 막을 것입니다. – technosaurus

+0

@ShafikYaghmour 조언이 좋습니다. 컴파일러의 적절한 호출을 사용하고, g ++로 C++ 소스를 컴파일하고, gcc로 C 소스를 컴파일하십시오. 물론 gcc를 호출하여 C++ 소스를 컴파일 할 수 있지만보다 나은 동작을 얻으려면 많은 옵션을 수동으로 전달해야합니다. –

답변

1

왜 두 멤버를 초기화하지 않습니까?

TTest oTest = {0, 0}; 

또는 가능성이 더 :

TTest oTest = { .uiRoll = 0, .usiVal = 0}; 

(이것은 당신이 참으로 gcc 컴파일 및 .c 인 확장자로 저장해야합니다 C 코드를 작성하는 것으로 가정 당신이 그 코드를 저장합니다. .cpp 확장자를 가진 파일에서 gcc은 C++ 모드로 전환하고 두 번째 버전에서는 실패합니다.)

다른 옵션 : 컴파일러를 GCC> = 4.7.2로 업그레이드하십시오 (일반 4.7.0은 en). 그 경고가 제거되고 코드에서 가지고있는 짧은 양식을 사용할 수 있습니다.

+0

많은 수의 중첩 구조가있는 구조가있는 것처럼 항상 가능한 것은 아닙니다. 그런 다음 모든 멤버 변수를 초기화하는 것이 큰 문제가됩니다. – Subhajit

+0

@Subhajit 그런 다음 C를 C로 컴파일합니다. C는 하나의 명시 적 초기화 프로그램에서만 문제가 없으며 6.7.9 (19)는 다른 모든 필드/요소가 적절한 제로 값 –

+0

@ 대니얼 : GCC는 여전히 버전 4.5와 4.6.3에서 경고합니다. 4.7과 4.8은 괜찮습니다. – Mat

0

또는 :

TTest oTest; 
memset(&oTest, 0, sizeof(oTest)); 

내가 경고를하지 않습니다. memset을 어떻게 사용하려고 했습니까?

#include <stdio.h> 
#include <string.h> 

typedef struct STest 
{ 
    unsigned int uiRoll; 
    unsigned short usiVal; 
}    TTest; 

int main() 
{ 
    /* Static declaration causes structure member's to be zeroed at instanciation */ 
    static const TTest zeroed_struct; 

    /* Structure assignement is then safely used */ 
    TTest oTest = zeroed_struct; 
    printf("The values are: %d, %d\n", oTest.uiRoll, oTest.usiVal); 
    return (0); 
} 

정적TTest 구조 선언에 자동 제로 모든 구조체 필드를 설정하면 컴파일러 :

+0

이 표기법은 이동성이 없다는 단점이 있으며, 보편적 인 0 이니셜 라이저를 사용하는 것이 좋습니다. –

+0

예 맞습니다 :) – Subhajit

0

이 표기법은 대부분의 는 구조를 초기화 제로로 하나 올바른/휴대용이다. 그런 다음 할당 연산자을 사용하여 구조체 멤버의 다른 인스턴스를 0으로 초기화 할 수 있습니다.

유니버셜 제로 이니셜 라이저을 사용하는 것이 정확하다고 생각됩니다. 그럼에도 불구하고 나는 GCC bugtracker에서 흥미로운 게시물을 발견했다. 이는 왜 GCC 버전의 경고가 발행 되었는가, 아마도 4.4 버전 : http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53119을 설명한다.

0

이 경우 GCC가 실제로 옳을 수 있다는 사실 외에도, 경고를 사용하지 않도록 설정하는 일반적인 법칙은 특정 사례에 대한 경고 메시지의 방출을 제어하는 ​​옵션에 no- 접두사를 추가하는 것입니다. 예를 들어, gcc의 매뉴얼 페이지를 읽으면 다음과 같습니다 :

집합체에는 모든 구성원을 초기화하지 않는 초기화 프로그램이 있습니다. 이 경고는 -Wiissing-field-initializers가 독립적으로 제어 할 수 있습니다.

따라서이 옵션을 사용하지 않으려면 -Wno-missing-field-initializers을 GCC에 전달해야합니다.

흥미롭게도 GCC 4.2.1은 경고가 명시 적으로 활성화되어 있어도 GCC 4.7.2가 그렇지 않을 때이 경고를 발행합니다. 실험을 조금 해본 후에 0 하나만 지정하면 경고가 표시되지 않는 것 같습니다. 그러나 둘 이상의 필드를 지정했지만 모두가 아닌 필드를 지정하면 경고가 표시됩니다.

희망이 있습니다. 행운을 빕니다!

+1

이것은 당시 GCC 팀에 의해보고되고 확인 된 버그 인 것 같습니다 : http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53119. 그러면이 경고가 '4.7.2'에서 더 이상 발행되지 않는 이유를 설명 할 수 있습니다. –