2011-10-25 4 views
0

나는 샘플 응용 프로그램에 다음 코드를했다. Visual Studio 2010을 사용할 때 예상했던 것, 즉 ostream에 대한 참조를 반환하지 않을 때 실패합니다. 그러나 두 플랫폼 용으로 컴파일 할 때 프로그램 출력은 동일합니다 (테스트 출력을 작성하는 사소한 main()이 있습니다).오버로드 연산자 << 돌아 ostream에 &

어느 것이 표준을 준수합니까? 내가 여기서 뭔가 분명한 것을 놓치고 있니?

- 데릭

+0

응답 해 주셔서 감사합니다. 어떤 (비 void) 함수로부터 무언가를 반환하지 않으면 컴파일 타임 오류가 될 수 있습니까? 나는 이것이 경고 이상의 것을 정당화 할 것이라고 생각했을 것이다. 약 동의했다. –

+0

또한 실시간 동작은 영리한 컴파일 결과 (David 제안) 또는 우연의 일치 (K-ballo)입니까? 실제로 그것이 내 코드를 "고치려고"하는 경우 경계를 넘어서고있는 것처럼 보입니다. –

+0

좋은 컴파일러는 문제를 발견했을 때 코드를 고치려고 아주 열심히 노력할 것입니다. 그러나 이것은 정의되지 않은 동작입니다. 나쁜 컴파일러는 아무것도하지 않을 수도 있습니다. 불쾌한 컴파일러는'degauss_hard_drive()'에 대한 호출을 삽입하고 아무 말도하지 않을 수 있습니다. 정의되지 않은 동작은 컴파일러가 사용자에게 좋고 코드를 거부 할 수 있다는 것을 의미합니다. 코드가 "좋"고 코드를 수정하고 코드를 포함하는 드라이브를 꺼내십시오. 정의되지 않은 동작에 대한 컴파일러의 응답에 대해서는 아무거나 다 괜찮습니다. –

답변

2

경고를 사용하여 컴파일 했습니까? g ++에서 warning: control reaches end of non-void function을 얻습니다.

코드의 첫 번째 오류가 발생하면 컴파일러가 중지되지 않도록해야합니다. 당신은 한꺼번에 많은 사람들을 잡을 수 있기를 원합니다. 이렇게하려면 컴파일러가 버그 코드를 패치해야합니다. 이 경우, 패치는 명백합니다 : 제공된 스트림을 인수로 리턴하십시오.

컴파일러가 무료로 제공 한 "수정 프로그램"을 신뢰하지 마십시오. 그들은 자유지만 아무것도 아닙니다. 대신 코드를 수정하십시오.

항상 경고를 사용하여 컴파일하십시오.

1

return 문 이외의 내용이 누락 되었습니까? 그것의 부족 정의되지 않은 동작 (나는 심지어 그런 간단한 경우에 대한 컴파일 시간 오류가 기대). os << rt.counter 표현식의 반환 값이 operator<<에 대한 반환 값이 예상되는 위치와 동일한 위치에 배치되어 우연히 작동 할 수도 있습니다.

+0

이것이 정의되지 않은 동작이라는 것이 옳았습니다. 어떤 이유로 든 GNU 제품군은 비공 인 기능의 종말에 도달하여 악의적 오류가 아닌 단순한 경고에 합당한 것으로 간주합니다. 그것은 약간의 반환 값을 구성하고 컴파일을 계속합니다. –

+0

@David Hammen : 함수가 함수의 끝까지 도달 할 수 있는지 여부를 확인하는 것은 꽤 복잡한 분석입니다. 표준에서 "진단이 필요하지 않습니다"라고 말하고 있습니다. –

+0

"진단 필요 없음"이라고 말할 이유가 없습니다. 6.6.3 para 2 : "함수의 끝에서 벗어나는 것은 값이없는 반환과 같습니다. 결과적으로 값을 반환하는 함수에서 정의되지 않은 동작이 발생합니다." 정의되지 않은 동작에는 진단이 필요하지 않습니다. 그렇다고 컴파일러가 UB를 감지 할 때 자동으로 남아 있어야하거나 컴파일러가 컴파일 된 코드를 방출해야한다는 것을 의미하지는 않습니다. 컴파일러 오류로 끝에서 흐를 처리도 완벽하게 OK입니다. –