2014-11-19 6 views
4

return 진술에 도달하지 않고 제어가 함수의 끝에 도달 할 수 있도록하는 void가 아닌 반환 유형의 함수를 정의하는 것이 합법적입니까?'제어가 비공쇄 기능의 끝 부분에 도달'하는 이유는 무엇입니까? 그것은 합법적입니까?

gccclang에만 경고가 표시됩니다. 이 코드는 합법적입니까 아니면이 컴파일러가 관대 한 코드입니까?

GCC :

경고 : 함수 귀환 문 반환 비 공간 는 [-Wreturn 형]

는 연타 :

경고 : 컨트롤의 끝에 도달 무공해 함수 [-Wreturn-type]

이것이 합법적 인 경우 리턴되는 값에 대해 정의 된 작동이 있습니까?

C++ 표준과
+0

실제로 컴파일러가 오류로 승격시켜야하는 경고 중 하나입니다. – Bathsheba

+0

적어도 하나의 용도가 있습니다. 이 질문에 대한 영감은이 질문에 대한 대답이었습니다. http://stackoverflow.com/questions/27011345/generate-mangled-names-from-source-code?noredirect = 1 # comment42549548_27011345 – Praxeolitic

답변

4

이미 Bathsheba에서 언급했듯이, void가 아닌 함수의 끝에서 벗어난 것은 실제로 정의되지 않은 동작입니다. 이것이 오류가 아니라 경고 인 이유는 이것이 결코 발생하지 않는다는 것을 증명할 수 있다는 것입니다. 예를 들어, 다음을 고려하십시오.

이제 함수 사용자가 주석을주의 깊게 읽으면 제대로 작동합니다. 이것은 분명히 위험한 일이므로 컴파일러는 경고하지 말라고 경고합니다.

편집 : MSalters 언급했듯이 클래스 불변 함수를 잘못 사용되지 않습니다 보장 할 수 있기 때문에, 이것은 개인 멤버 함수 덜 위험하다 .

// Every member function of SomeClass makes sure 
// that i_ is in the legal range when it's done 
class SomeClass { 
    public: 
     SomeClass() : i_{27} {} 
    // Possibly more public or private functions that all make sure i_ stays valid 
    private: 
     bool foo() {if (i_ > 3) return true;} 
     int i_; 
}; 

이제 (클래스 테이너로) i_ 항상 항상 잘 작동합니다 적어도 4foo 있는지 확인 할 수 있습니다 : 예를 생각해 보자. 개인적으로는 유지 보수성과 가독성을 손상시킬 수 있기 때문에 여전히이를 피할 것이지만 지금은 "만" 모든 클래스 관리자는이 불변성에 대해 걱정할 필요가 있기 때문에 무료 버전보다 낫습니다/실수를 할 수 있습니다.

+1

물론 함수가 개인 클래스 멤버 일 때 약간 위험합니다. 이러한 함수는 클래스 불변량에 의존 할 수 있습니다. – MSalters

+0

@MSalters 덜 위험한 이유를 설명해 주시겠습니까? –

+0

@NeilKirk 편집 완료. –

3

, 6.6.3 :

함수의 끝을 흐르는없이 값 리턴 동등하다; 이로 인해 값을 반환하는 함수에서 정의되지 않은 동작이 발생합니다.

따라서 명시적인 반환 값을 가지지 않으면 의 정의되지 않은 동작이됩니다.

+0

반환 된 값의 내용을 읽는 것이 UDB에서 발생합니까, 함수 호출 UDB입니까, 아니면 함수의 정의 UDB입니까? – Praxeolitic

+0

표준에 명시되지 않은 것 같습니다. 특히 인라인 함수를 사용하여 정확한 위치를 정확히 찾아내는 것이 좋지 않다고 생각합니다. – Bathsheba

+0

그렇다면 프로그램에 UDB가있는 경우에는 * 모든 * UDB가됩니다. 그러나 프로그램이 정의 만하고 함수를 호출하지 않는다면 UDB입니까? 반환 값을 읽지 않고 호출하는 것은 어떻습니까? 표준에 명시되어 있습니까? – Praxeolitic