g++ warning missing initializer for member

다음과 같이 time struct(tm) 생성시 초기화를 하지 않은 상태의 c++코드가 있을때

#include <iostream>
#include <sys/time.h>
int main() {
    struct tm aaa{};
    std::cout << aaa.tm_sec << std::endl;
    return 0;
}

다음과 같이 빌드 하면 괜찮은데,
g++ -std=c++11 ysoftman.cpp
또는
g++ -std=c++11 -Wall ysoftman.cpp

다음과 같이 -Wextra 옵션을 주면�warning 이 발생한다.
g++ -std=c++11 -Wextra ysoftman.cpp

ysoftman.cpp:5:16: warning: missing initializer for member ‘tm::tm_sec’ [-Wmissing-field-initializers]
  struct tm aaa{};
                ^
ysoftman.cpp:5:16: warning: missing initializer for member ‘tm::tm_min’ [-Wmissing-field-initializers]
ysoftman.cpp:5:16: warning: missing initializer for member ‘tm::tm_hour’ [-Wmissing-field-initializers]
...

참고로 -Wextra 는 -Wall 에 포함되지 않는 warning 에 대한것으로
위와 같이 초기화 누락이나 포인터를 정수형과 비교할때 발생하는 경고(comparison between pointer and integer) 를 활성화 한다.
그리고 -W 옵션 대신 -Wextra 를 사용하라고 한다.
g++ -v --help | grep Wextra
-W switch is deprecated; use -Wextra instead

[해결방법1]
-Wextra 를 사용하지 않기
찾아보니 사실 기본 0값으로 초기화되는데 gcc 는 너무 과도하게 warning 을 발생한다는 의견도 있다.

[해결방법2]
다음과 같이 모든 멤버를 초기화한다. (struct 내의 생성자()를 두고 초기화하면 편한데, tm 은 standard library라 그럴 수 없다.)
    struct tm aaa{
    .tm_sec=0,
    .tm_min=0,
    .tm_hour=0,
    .tm_mday=0,
    .tm_mon=0,
    .tm_year=0,
    .tm_wday=0,
    .tm_yday=0,
    .tm_isdst=0,
    .tm_gmtoff=0,
    .tm_zone=NULL};

[해결방법3]
경고 메시지대로 -Wno-missing-field-initializers 를 추가해서 초기화 경고만 제외시킨다.
g++ -std=c++11 -Wextra -Wno-missing-field-initializers ysoftman.cpp

comments:

댓글 쓰기