[g++] gcc 경고 ” ‘다음에 초기화됩니다’

타사 코드에서 수정할 수없는 많은 경고가 표시됩니다. 이 경고를 비활성화하거나 VC ++의 #pragma push / pop와 같은 특정 영역에서는 적어도 경고를 비활성화하는 방법이 있습니까?

예:

list.h:1122: warning: `list<LogOutput*, allocator<LogOutput*> >::node_alloc_' will be initialized after
list.h:1117: warning:   `allocator<LogOutput*> list<LogOutput*, allocator<LogOutput*> >::alloc_'



답변

멤버가 클래스에 나타나는 순서대로 이니셜 라이저 목록에 표시되는지 확인하십시오.

Class C {
   int a;
   int b;
   C():b(1),a(2){} //warning, should be C():a(2),b(1)
}

또는 당신은 설정할 수 있습니다 -Wno-reorder


답변

로 비활성화 할 수 있습니다 -Wno-reorder.


답변

이 오류가있는 QT를 사용하는 사람들은 이것을 .pro 파일에 추가하십시오.

QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder


답변

사용 -Wno-reorder(man gcc는 당신의 친구입니다 :))


답변

라이브러리 헤더에 오류가 표시되고 GCC를 사용하는 경우 -isystem대신 대신을 사용하여 헤더를 포함하여 경고를 비활성화 할 수 있습니다 -I.

clang 에도 비슷한 기능이 있습니다 .

당신이 CMake를 사용하는 경우, 당신은 지정할 수 있습니다 SYSTEM위해 include_directories.


답변

초기화 순서는 중요하지 않습니다. 모든 필드는 클래스 / 구조에서 정의 된 순서대로 초기화됩니다. 그러나 초기화 목록의 순서가 다른 경우 gcc / g ++에서이 경고를 생성하십시오. 이 경고를 피하려면 초기화 순서 만 변경하십시오. 그러나 구성하기 전에 초기화에서 사용하여 필드를 정의 할 수 없습니다. 런타임 오류입니다. 따라서 정의 순서를 변경하십시오. 조심하고주의하십시오!


답변

Class C {
   int a;
   int b;
   C():b(1),a(2){} //warning, should be C():a(2),b(1)
}

a가 b보다 먼저 초기화되고 a가 b에 종속되면 순서가 중요합니다. 정의되지 않은 동작이 나타납니다.