문제:
개발자가 Windows용 g 버전을 사용할 때 예기치 않은 동작이 발생했습니다. Strawberry Perl을 통해 얻었습니다. 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" } }
이와 같이 void가 아닌 함수에서 return 문을 생략하면 정의되지 않은 동작이 발생합니다. ISO C -98 표준은 다음을 지정합니다.
함수의 끝에서 흘러나오는 것은 값이 없는 반환과 동일합니다. 이로 인해 값 반환 함수에서 정의되지 않은 동작이 발생합니다.
왜 경고 없이 컴파일됩니까?
반환 문을 생략하는 동안은 정의되지 않습니다. 동작에 따라 일부 컴파일러는 기본적으로 경고를 발행하지 않을 수 있습니다. 보다 철저한 경고를 활성화하려면 컴파일 시 -Wall 옵션을 사용하는 것이 좋습니다.
Return 문 생략의 결과
비-문에서 return 문 생략 void 함수는 예측할 수 없는 결과를 초래할 수 있습니다. 이 함수는 초기화되지 않은 값을 반환하거나 프로그램 충돌을 일으킬 수 있습니다. 또한, 후속 코드에서 반환된 값을 사용하면 예상치 못한 결과가 발생할 수 있습니다.
결론
이 경우 g 컴파일러에서는 return 문 생략을 허용했지만, ISO C 표준을 준수하고 항상 void가 아닌 함수에 return 문을 포함하는 것이 중요합니다. return 문을 생략하면 정의되지 않은 동작과 예측할 수 없는 결과가 발생할 수 있습니다.
위 내용은 내 C g 컴파일러가 구조를 반환하는데도 반환 문 없이 함수를 컴파일하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!