컴파일러가 "initializer 누락"이라는 경고를 보내는 이유는 무엇입니까?구조가 초기화되지 않았습니까?
프로그램 프런트엔드를 만들고 있어요통화 중인 프로그램을 시작하려면CreateProcess()
다른 것 중에서 포인터를 받습니다.STARTUPINFO
구조.이전에 수행한 구조를 초기화하려면:
STARTUPINFO startupInfo = {0}; // Or even '\0'.
startupInfo.cb = sizeof(startupInfo);
GCC를 사용하여 프로그램을 컴파일할 때 이러한 경고 세트를 활성화합니다.-Wall -Wextra
첫 번째 줄을 가리키는 이니셜라이저가 누락되어 있다는 경고가 나옵니다.
warning: missing initializer
warning: (near initialization for 'startupInfo.lpReserved')
그래서 저는 이렇게 했습니다.
STARTUPINFO startupInfo;
memset(&startupInfo, 0, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
이렇게 하면 컴파일러는 경고를 하지 않습니다.문제는 구조체를 초기화하는 두 방법의 차이점은 무엇인가 하는 것입니다.첫 번째 방법으로는 구조가 초기화되지 않았습니까?어떤 것을 추천하시겠습니까?
이는 C++ 프로그램의 GCC에 대해 다음과 같이 구조를 초기화함으로써 쉽게 수정할 수 있습니다.
STARTUPINFO startupInfo = STARTUPINFO();
- 바로 며칠 전에 이 일을 했다
GCC는 단지 지나치게 편집증적인 것 뿐이고, 내 생각에 정당한 이유도 없지만, GCC 유지자들이 내가 하는 C의 뉘앙스에 대해 훨씬 더 많이 알고 있는 것은 확실합니다.
GCC 메일링 리스트에서 이 문제에 대해 설명하는 작은 줄거리를 참조해 주세요.
- http://gcc.gnu.org/ml/gcc-bugs/1998-07/msg00031.html
- http://gcc.gnu.org/ml/gcc-bugs/1998-07/msg00059.html
- http://gcc.gnu.org/ml/gcc-bugs/1998-07/msg00128.html
요점 - 구조 초기화는 다음과 같습니다.{0}
사실상 0이 모든 것을 초기화합니다.
C99 표준은 6.7.8/21 "초기화 - 기호학"에서 다음과 같이 규정하고 있다.
괄호로 둘러싸인 리스트 내의 이니셜라이저가 애그리게이트의 요소 또는 멤버의 수보다 적은 경우 또는 기존의 크기의 배열을 초기화하기 위해 사용되는 문자열 리터럴 내의 문자 수가 어레이 내의 요소 수보다 적은 경우 애그리게이트의 나머지 문자는 정적 저장 기간을 갖는 객체와 암묵적으로 동일하게 초기화되어야 한다.
C90은 특히 6.5.7에서도 약간 다른 표현으로 같은 내용을 언급하고 있습니다(즉, C99는 여기에 새로운 것을 추가하지 않았습니다).
또, C++ 에서는, 이것이 확장되어 비어 있는 브레이스 세트 「」가 되는 것에 주의해 주세요.{}
멤버의 수나 멤버의 수를 알 수 없는 상황(템플릿 등)이 있었기 때문에 오브젝트에 대해 값 초기화를 수행합니다.따라서 베스트 프랙티스일 뿐만 아니라 오브젝트의 멤버 수보다 짧은 이니셜라이저 리스트가 필요할 수 있습니다.
이 웹 페이지에서는 기본적인 문제에 대해 자세히 설명합니다.http://ex-parrot.com/ ~ http://ex-parrot.com/ ~ http://ex-parrot.com/ ~ /randomrandom / // / initialize 。
회피책으로 현재 사용하고 있는 솔루션은 이 경고를 선택적으로 억제하는 것입니다.
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmissing-field-initializers"
STARTUPINFO startupInfo = {0};
#pragma clang diagnostic pop
안타깝게도, 이것은 꽝에서만 작동하며 GCC에서는 작동하지 않는 것 같습니다.
를 사용해서 한 한 많은 했습니다.-Wall -Wextra
.
이 경우 모든 필드를 지정하지 않았음을 나타내는 경고가 표시되며, 이는 완전히 유효하지만 의도하지 않았을 수 있습니다.
는 ''를 할 수 .-Wno-missing-field-initializers
에서는 C++라고 하다를 할 수 .boost::initialized_value
이 경고를 없애야 합니다.이 꺼졌습니다.boost
그래서 당신의 경우 다른 경고가 나올지 모르겠습니다.이렇게 하면 경고를 해제할 필요가 없습니다.
예제:
T bla = boost::initialized_value;
언급URL : https://stackoverflow.com/questions/1538943/why-is-the-compiler-throwing-this-warning-missing-initializer-isnt-the-stru
'source' 카테고리의 다른 글
스택을 정렬한다는 것은 무엇을 의미합니까? (0) | 2022.07.17 |
---|---|
'더블 프리 또는 파손' 오류를 추적하는 방법 (0) | 2022.07.17 |
자바에서의 인터페이스와 @interface의 차이점은 무엇입니까? (0) | 2022.07.17 |
nuxt 레이아웃 내에서 메서드를 실행하기 위한 vuex 상태 변경 감지 (0) | 2022.07.17 |
Java 멀티스레딩에서 Count Down Latch는 어떻게 사용됩니까? (0) | 2022.07.17 |