[c] 컴파일러가 “missing initializer”라는 경고를 던지는 이유는 무엇입니까? 구조가 초기화되지 않았습니까?

프로그램을위한 일종의 프론트 엔드를 만들고 있습니다. 프로그램을 시작하기 위해 나는 CreateProcess()무엇보다도 STARTUPINFO구조에 대한 포인터를받는 호출을 사용하고 있습니다. 내가 사용했던 구조를 초기화하려면 :

이러한 경고 세트를 활성화하는 GCC로 프로그램을 컴파일 할 때 -Wall -Wextra첫 번째 줄을 가리키는 누락 된 초기화 프로그램이 있다는 경고가 표시됩니다.

그래서 결국 :

이런 식으로 컴파일러는 경고를하지 않습니다. 문제는 구조를 초기화하는 이러한 방법의 차이점은 무엇입니까? 첫 번째 방법을 사용하면 구조가 초기화되지 않습니까? 어느 것을 추천 하시겠습니까?



답변

GCC는 지나치게 편집증적일뿐입니다. 제 생각에는 정당한 이유가 없습니다.하지만 GCC 관리자가 제가하는 C의 뉘앙스에 대해 더 많이 알고 있다는 것은 확실히 사실입니다.

GCC 메일 링리스트의 문제에 대한이 작은 토론 스레드를 참조하십시오.

결론은-구조체를 {0}초기화하면 실제로는 모든 것을 초기화합니다.

C99 표준은 6.7.8 / 21 “초기화-Sematics”에서 다음과 같이 말합니다.

중괄호로 묶인 목록의 이니셜 라이저가 집계의 요소 또는 멤버보다 적거나 알려진 크기의 배열을 초기화하는 데 사용되는 문자열 리터럴의 문자가 배열의 요소보다 적 으면 집계의 나머지는 다음과 같아야합니다. 정적 저장 기간이있는 객체와 동일하게 암시 적으로 초기화됩니다.

C90은 6.5.7에서 약간 다른 표현을 사용하여 본질적으로 동일하다고 말합니다 (즉, C99는 여기에 새로운 것을 추가하지 않았습니다).

또한 C ++에서는이 기능이 확장되어 빈 중괄호 ” {}“가 개체에 대한 값 초기화를 수행합니다. 이는 멤버가 무엇인지 또는 유형이 몇 개의 멤버인지조차 알지 못하는 상황 (템플릿과 같은)이 있기 때문입니다. 이있을 수 있습니다. 따라서 좋은 습관 일뿐만 아니라 때때로 개체가 가질 수있는 멤버 수보다 짧은 이니셜 라이저 목록이 필요합니다.


답변

구조를 다음과 같이 초기화하여 C ++ 프로그램의 GCC에 대해 쉽게 수정할 수 있습니다.

  • 며칠 전에 정확히 이렇게 했어요


답변

를 사용하여 가능한 한 많은 경고를 요청했습니다
-Wall -Wextra.

이 경우 모든 필드를 지정하지 않았다는 경고가 표시됩니다. 이는 완벽하게 유효하지만 의도하지 않았을 수 있습니다.

다음을 추가하여이 경고를 억제 할 수 있습니다.
-Wno-missing-field-initializers


답변

이 웹 페이지는 근본적인 문제에 대해 자세히 설명합니다.
http://ex-parrot.com/~chris/random/initialise.html

해결 방법으로 현재 해결 방법은이 경고를 선택적으로 억제하는 것입니다.

슬프게도 이것은 clang에서만 작동하며 GCC에서는 작동하지 않는 것 같습니다.


답변

C ++에서는 boost::initialized_value이 경고를 제거 하는 데 사용할 수 있습니다 . 에 대한 경고가 꺼져 있습니다 boost. 그래서 이것이 당신의 경우에 다른 경고를 유발하는지 모르겠습니다. 이렇게하면 경고를 비활성화 할 필요가 없습니다.

예:


답변