gcc 경고 " '다음에 초기화됩니다'


228

타사 코드에서 수정할 수없는 많은 경고가 표시됩니다. 이 경고를 비활성화하거나 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_'

실제 경고 몇 줄을 게시 할 수 있습니까? 또한 이것이 C, C ++인지, 소스가 있는지, 링커 또는 컴파일 프로세스에서 경고가 발생하는지 알려줍니다.
csl

답변:


371

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

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

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


91
이것이 중요한 이유는 무엇입니까? 이 경고가 존재하는 이유는 무엇입니까?
Eloff

40
(추천하지 않음) 경우에 따라 @Eloff, ba초기화 서로에 의존 수 있습니다. 순진한 사용자가 초기화 순서를 변경하여 효과를 얻으려고하면 경고가 작동하지 않음을 알 수 있습니다.
Gorpik

24
선언 사이에 관계가 없더라도 선언 순서는 의미 론적 의미가 있습니까? 무의미 ​​해!
Cuadue

10
이것은 왜이 경고가 존재하고 -Wno-reorder어떤 문제가 생길 수 있는지 언급 하지 않고 설명 합니다. 나는 OP가 다른 세부 사항을 요구하지 않는다는 것을 알고 있지만, 투표율이 높은 대답은 적어도 주변 상황과주의를 언급 할 것으로 예상됩니다. OP 가 작성 해야하는 질문에 대답하지 않겠습니까?
underscore_d

4
@ cp.engr 멤버는 init-list의 순서가 아닌 선언 순서대로 초기화됩니다. 따라서 멤버의 초기화가 다른 초기화에 의존하지만 선언이 바뀌면 의존하는 사람이 종속 된 후에 초기화됩니다. 순수한 UB이기 때문에 아주 나쁜 시간을 보낼 것입니다.
underscore_d


17

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

QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder

7

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


6
MIYF (사람이 당신의 친구입니다) 당신이 괜찮다면, 내가 그것을 사용하기 위하여려고하고있다 :) : 와우, 당신은 RT_M 말할 수있는 새로운 방법을 발견
오렌 S

4

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

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

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


"지정 SYSTEM" 방법을 설명 할 수 있습니까 ?
einpoklum

1
`SYS`라는 문자열을 include_directories줄 끝에 넣으십시오 .
Drew Noakes

1

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


OP는 경고의 의미 또는 코드 수정 방법이 아니라 경고를 비활성화하는 방법을 알고 싶어했습니다. 실제로 게시물에 따르면 코드는 타사이며 수정할 수 없습니다. 그것들은 정의 순서를 바꿀 수 없으며 아마도 초기화 순서도 바꿀 수 없습니다.
Tim Seguine

그것은 매우 않습니다 초기화 목록에서 2 개체가 1 개체에서 initd 경우 문제가 있지만 헤더에 주변의 잘못된 방법을 선언하고 있습니다. 이 경우 상황이 매우 이상해질 수 있습니다.
underscore_d

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.