2009-10-14 6 views
173

이후에 초기화됩니다. 수정할 수없는 타사 코드에서 이러한 경고가 많이 발생합니다. 푸시 VC에서/팝 ++)gcc 경고 " '는'

예 :.

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_' 
+0

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

답변

277

은 클래스

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

에 표시하거나,이 오류를 가진 QT를 사용하는 사람들을 위해 -Wno-reorder

+10

OP는 코드를 수정할 수 없습니다. –

+64

왜 이것이 중요한가? 왜이 경고가 존재합니까? – Eloff

+30

@loff 어떤 경우 (권장하지 않음),'b'와'a' 초기화가 서로 의존 할 수도 있습니다. 순진한 사용자는 초기화 명령을 변경하여 효과를 얻으려고 시도 할 수 있으며 경고는 작동하지 않는다는 것을 분명히합니다. – Gorpik

28

당신은 -Wno-reorder으로 비활성화 할 수 있습니다

7

사용 -Wno-reorder (사람이 당신의 친구 :))

GCC입니다 0
+5

와우, RT_M : MIYF (남자 친구 야)라고하는 새로운 방법을 발견했습니다 괜찮 으면 사용하겠습니다 :) –

12

차례에이를 추가 할 수있는 멤버가 같은 순서로 초기화 목록에 표시해야합니다. 프로 파일

QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder 
1

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

+0

OP는 경고를 비활성화하는 방법을 알고 싶었습니다. 경고의 의미 나 코드 수정 방법을 알지 못했습니다. 사실이 게시물은 코드가 제 3 자로 수정 될 수 없다고 말하고있다. 그것들은 정의의 순서와 아마도 초기화의 순서를 바꿀 수 없다. –

+0

init list의 두 번째 객체가 첫 번째 객체에서 초기화되었지만 헤더에서 잘못 선언 된 경우 문제가됩니다 ** ** ** 중요합니다. 이 경우 상황이 매우 이상해질 수 있습니다. –

4

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

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

CMake를 사용하는 경우 include_directoriesSYSTEM을 지정할 수 있습니다.

+0

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

+1

'SYSTEM' 문자열을'include_directories' 줄 끝에 넣으십시오. –

관련 문제