>백엔드 개발 >C++ >Void가 아닌 C 함수에서 반환 문을 생략하는 것이 때때로 작동하는 이유(그리고 작동하지 말아야 하는 이유)

Void가 아닌 C 함수에서 반환 문을 생략하는 것이 때때로 작동하는 이유(그리고 작동하지 말아야 하는 이유)

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-20 02:42:01781검색

Why Does Omitting a Return Statement in a Non-Void C   Function Sometimes Work (and Why It Shouldn't)?

C에서 Return 문 생략

C에서는 void가 아닌 함수를 return 문으로 종료하는 것이 관례입니다. 그러나 Strawberry Perl과 함께 배포되는 특정 Windows 버전의 g에서 이상한 현상이 관찰되었습니다. 이 버전에서는 void가 아닌 값을 반환하는 함수에서 return 문을 생략하여 예기치 않은 동작이 발생할 수 있습니다.

다음 멤버 함수를 고려하세요.

struct boundTag Box::getBound(int side) {
    struct boundTag retBoundTag;
    retBoundTag.box = this;
    switch (side)
    {
        // set retBoundTag.bound based on value of "side"
    }
}

이 함수는 다음과 같이 설계되었습니다. 바인딩된 태그를 나타내는 구조를 반환합니다. 그런데 개발자가 실수로 return 문을 생략했습니다.

// ... code from above
}

이 함수를 테스트할 때 개발자는 return 문이 누락되었음에도 불구하고 유효한 출력을 받았습니다. return 문을 제거한 후에도 경고 없이 코드가 컴파일됩니다.

기본 문제는 void가 아닌 함수에서 return 문을 생략하면 정의되지 않은 동작이 호출된다는 것입니다. ISO C -98 표준은 void가 아닌 함수의 끝에서 흘러나오는 것은 값이 없는 반환과 동일하여 정의되지 않은 동작을 초래한다고 명시적으로 명시합니다.

// ... code from above
// Undefined behavior
}

이 시나리오에서 g는 다음을 반환할 가능성이 높습니다. 컴파일러가 의도한 반환 값을 결정할 수 없기 때문에 쓰레기 값입니다. 코드에서 이 반환된 값을 사용하는 것은 위험하며 예측할 수 없는 결과를 초래할 수 있습니다.

g는 기본적으로 경고를 표시하지 않을 수 있지만 컴파일 중에 -Wall 옵션을 사용하면 컴파일러가 이러한 경우에 대해 경고하도록 강제합니다. 이 옵션은 누락된 return 문을 강조 표시하고 정의되지 않은 동작을 방지하는 데 도움이 됩니다.

따라서 반환 값이 즉시 사용되지 않더라도 void가 아닌 함수에는 항상 return 문을 포함하는 것이 중요합니다. 이렇게 하면 코드가 C 표준을 준수하고 잠재적인 정의되지 않은 동작을 방지할 수 있습니다.

위 내용은 Void가 아닌 C 함수에서 반환 문을 생략하는 것이 때때로 작동하는 이유(그리고 작동하지 말아야 하는 이유)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.