2015-02-05 3 views
3

What's the point of g++ -Wreorder을 보면, -Wreorder은 무엇에 유용할까요?왜 g ++가 더 스마트하지 않습니까?

struct Harmless { 
    C() : b(1), a(2) {} 
    int a; 
    int b; 
}; 

또는 고장 :

struct Broken { 
    C() : b(1), a(b + 1) {} 
    int a; 
    int b; 
}; 

내 질문은 다음이다 :하지만 컴파일러는 이러한 순서 변경이 무해 여부를 감지 할 수있을 것이라고 무리하지 않는 것 왜 감지 GCC하지 않습니다 이니셜 라이저의 순서에 관한이 담요 경고 대신에 초기화되지 않은 멤버의 실제 사용을 경고합니다.

내가 이해하는 한, -Wuninitialized은 자동 변수에만 적용되며 실제로 위의 오류는 감지하지 못합니다.


편집 :

내가 원하는 동작을 공식화에서의 자상 : 감안할 때 초기화 목록 : a1(expr1), a2(expr2), a3(expr3) ... an(exprn), 내가 경고 경우 (단 경우) 초기화의 실행을 원하는 순서대로 그들이 초기화되지 않은 값을 참조합니다. 나는. -Wuninitialized은 초기화되지 않은 자동 변수 사용에 대해 경고합니다.

몇 가지 추가 배경 : 나는 주로 Windows 기반 회사에서 근무하지만 기본적으로 모두가 Visual Studio를 사용합니다. VS에는이 경고가 없으므로 아무도 정확한 주문이없는 것에 대해 걱정하지 않으므로 (수동 검사를 제외하고 주문을 망쳤을 때 알 수있는 방법이 없습니다) 따라서 누군가가 무언가를 깨뜨릴 때마다 끊임없이 고쳐야한다는 끝없는 경고를 남깁니다. 나는 정말로 문제가있는 경우에 대해서만 알리고 양성의 경우는 무시하고 싶습니다. 그래서 내 질문에 어쩌면 더 나은 문구가 : 기술적 으로이 같은 경고/오류 구현할 수 있습니까? 내 직감은 그렇다고 말하지만, 아직 구현되지 않았다는 사실 때문에 의심 스럽습니다.

+1

버그라고 생각되면 버그 리포트를 제출하십시오. 어쨌든, 여기 제가 얻은 것이 있습니다. (http://coliru.stacked-crooked.com/a/69eeca3016360f9b). –

+0

최소한 이니셜 라이저 목록': a1 (expr1), a2 (expr2), a3 (expr3) ... an (exprn) '이 경고를받을 자격이 있는지를 공식적인 방법으로 알려주십시오. – MSalters

+0

초기화 목록에있는 멤버가 클래스에 정의 된 순서와 다른 순서로 프로그램을 디버깅 할 때 혼동을 줄 수 있습니다. 회원이 독립적 인 경우에도. – lego

답변

4

내 생각에 우리가 -Wold-style-cast을 가지고있는 것과 같은 이유로 : 너무 보수적 인 측면에서 안전 오류가 있습니다. 걸리는 시간은 HarmlessCarelessMistake으로 변환하는 순간입니다. 어쩌면이 개발자는 서둘러 GCC의 구 버전을 가지고 있거나 "단지 경고"라고보고 있습니다.

이것은 많은 경고 중에서 사실입니다. 그들은 종종 가짜이며, 깔끔하게 컴파일하기 위해 약간의 구조 조정이 필요하지만 어떤 경우에는 실제 문제를 나타냅니다. 좋은 프로그래머라면 누구나가 거짓 반응을 통해 어떤 작업을 선호 할 것입니다. 즉, 더 적은 수의 거짓 가사을 얻게됩니다.

질문에 대한 유효한 직접 답변이 있으면 놀랄 것입니다. 할 수 없다는 기술적 인 이유는 없습니다. 그냥. . . 왜 의심스러운 것이 실제로 괜찮은지 알아 내려고 애쓰는 이유는 무엇입니까? 프로그래밍은 인간의 일입니다.


개인적인 이유로 개인 변수를 선언 한 순서대로 초기화하는 것이 좋다고 생각합니다.

+0

컴파일러가 CarelessMistake에 대한 오류를 감지하여 출력하는 한 헤더와 구현에서 순서를 동일하게 유지할 이유가 없습니다. 그것은 (희귀 한) 부주의 한 실수를 제외하고는 모두를위한 불필요한 작업입니다. –

+0

프로그래밍은 인간의 일이지만, 인간은 게으르다. 많은 사람들이 양심적 인 경고의 흐름을 무시하고 중요한 것들을 놓칠 것이다. 하지만 네가 한 말은 그걸 할 수 있다는거야. 아직 아무도 그 일을 충분히 신경 쓰지 않았다는거야? –