프로그램을위한 일종의 프론트 엔드를 만들고 있습니다. 프로그램을 시작하기 위해 나는 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);
이런 식으로 컴파일러는 경고를하지 않습니다. 문제는 구조를 초기화하는 이러한 방법의 차이점은 무엇입니까? 첫 번째 방법을 사용하면 구조가 초기화되지 않습니까? 어느 것을 추천 하시겠습니까?
답변
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}
초기화하면 실제로는 모든 것을 초기화합니다.
C99 표준은 6.7.8 / 21 “초기화-Sematics”에서 다음과 같이 말합니다.
중괄호로 묶인 목록의 이니셜 라이저가 집계의 요소 또는 멤버보다 적거나 알려진 크기의 배열을 초기화하는 데 사용되는 문자열 리터럴의 문자가 배열의 요소보다 적 으면 집계의 나머지는 다음과 같아야합니다. 정적 저장 기간이있는 객체와 동일하게 암시 적으로 초기화됩니다.
C90은 6.5.7에서 약간 다른 표현을 사용하여 본질적으로 동일하다고 말합니다 (즉, C99는 여기에 새로운 것을 추가하지 않았습니다).
또한 C ++에서는이 기능이 확장되어 빈 중괄호 ” {}
“가 개체에 대한 값 초기화를 수행합니다. 이는 멤버가 무엇인지 또는 유형이 몇 개의 멤버인지조차 알지 못하는 상황 (템플릿과 같은)이 있기 때문입니다. 이있을 수 있습니다. 따라서 좋은 습관 일뿐만 아니라 때때로 개체가 가질 수있는 멤버 수보다 짧은 이니셜 라이저 목록이 필요합니다.
답변
구조를 다음과 같이 초기화하여 C ++ 프로그램의 GCC에 대해 쉽게 수정할 수 있습니다.
STARTUPINFO startupInfo = STARTUPINFO();
- 며칠 전에 정확히 이렇게 했어요
답변
를 사용하여 가능한 한 많은 경고를 요청했습니다
-Wall -Wextra
.
이 경우 모든 필드를 지정하지 않았다는 경고가 표시됩니다. 이는 완벽하게 유효하지만 의도하지 않았을 수 있습니다.
다음을 추가하여이 경고를 억제 할 수 있습니다.
-Wno-missing-field-initializers
답변
이 웹 페이지는 근본적인 문제에 대해 자세히 설명합니다.
http://ex-parrot.com/~chris/random/initialise.html
해결 방법으로 현재 해결 방법은이 경고를 선택적으로 억제하는 것입니다.
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmissing-field-initializers"
STARTUPINFO startupInfo = {0};
#pragma clang diagnostic pop
슬프게도 이것은 clang에서만 작동하며 GCC에서는 작동하지 않는 것 같습니다.
답변
C ++에서는 boost::initialized_value
이 경고를 제거 하는 데 사용할 수 있습니다 . 에 대한 경고가 꺼져 있습니다 boost
. 그래서 이것이 당신의 경우에 다른 경고를 유발하는지 모르겠습니다. 이렇게하면 경고를 비활성화 할 필요가 없습니다.
예:
T bla = boost::initialized_value;