source

나가는 것과 돌아오는 것의 차이는 무엇입니까?

gigabyte 2022. 12. 8. 21:21
반응형

나가는 것과 돌아오는 것의 차이는 무엇입니까?

C 프로그램의 어느 곳에서 호출되었을 때 C 프로그래밍에서 return 문과 exit 문 사이의 차이점은 무엇입니까?

  • 현재 함수에서 반환됩니다.이것은 언어 키워드입니다.for또는break.
  • exit()는 프로그램 전체를 종료합니다(stdio 버퍼 플러시 후 등).

양쪽이 (거의) 같은 일을 하는 유일한 경우는main()메인으로부터의 복귀가, 기능으로서exit().

대부분의 C 실장에서는main기동 코드에 의해서 호출되는 실제의 함수입니다.int ret = main(argc, argv); exit(ret);C 표준은 다음과 같은 일이 발생함을 보증합니다.main는 반환되지만 실장에서는 처리됩니다.

의 예return:

#include <stdio.h>

void f(){
    printf("Executing f\n");
    return;
}

int main(){
    f();
    printf("Back from f\n");
}

이 프로그램을 실행하면 다음과 같이 출력됩니다.

Executing f
Back from f

의 다른 예exit():

#include <stdio.h>
#include <stdlib.h>

void f(){
    printf("Executing f\n");
    exit(0);
}

int main(){
    f();
    printf("Back from f\n");
}

이 프로그램을 실행하면 다음과 같이 출력됩니다.

Executing f

"Back from f"는 절대 못 받아요.또,#include <stdlib.h>라이브러리 함수를 호출하는 데 필요합니다.exit().

또한 파라미터는exit()는 정수입니다(런처 프로세스가 취득할 수 있는 프로세스의 반환 상태.일반적인 사용법은 성공 또는 기타 오류의 경우 0입니다).

return 문의 매개 변수는 함수의 반환 유형에 관계없이 지정됩니다.함수가 void를 반환하는 경우 함수 종료 시 반환을 생략할 수 있습니다.

마지막 포인트exit()두 가지 맛이 있다_exit()그리고.exit(). 형태와 다른 점은exit()(및 메인에서 복귀) 콜 함수는 다음과 같이 등록되어 있습니다.atexit()또는on_exit()이 프로세스를 실제로 종료하기 전에_exit()(출처:#include <unistd.h>또는 그 동의어 _Exit from#include <stdlib.h>)는 프로세스를 즉시 종료합니다.

또, C++에 고유의 문제도 있습니다.

C++는 기능을 종료할 때 C보다 훨씬 많은 작업을 수행합니다(return특히 범위를 벗어나는 로컬 객체의 소멸자를 호출합니다.대부분의 경우 프로그래머는 프로세서가 정지된 후 프로그램 상태에 크게 신경 쓰지 않기 때문에 할당된 메모리가 해방되고 파일 소스가 닫히는 등 큰 차이가 없습니다.단, 디스트럭터가 IO를 실행하는지는 문제가 될 수 있습니다.예를 들어 자동 C++OStream로컬로 작성된 콜은 종료 시 플래시되지 않으며 플래시되지 않은 데이터가 손실될 수 있습니다(반면 스태틱).OStream플래시 됩니다).

구식 C를 사용하고 있는 경우는, 이 일은 일어나지 않습니다.FILE*스트림입니다.이것들은 에 플러시 됩니다.exit()실제로 규칙은 등록된 종료 함수와 동일합니다.FILE*다음을 포함한 모든 정상 종료 시 플러시됩니다.exit()에 대한 콜은 할 수 없습니다._exit()또는 중단합니다.

또한 C++는 함수를 종료하는 세 번째 방법인 예외 발생을 제공합니다.함수를 종료하는 이 방법은 파괴자를 호출합니다.발신자 체인의 어디에도 캐치되지 않은 경우 예외는 main() 함수로 올라가 프로세스를 종료할 수 있습니다.

다음 중 하나를 호출하면 정적 C++ 개체(글로벌) 소멸자가 호출됩니다.return부터main()또는exit()프로그램 내 어디에나 있습니다.프로그램을 종료하면 호출되지 않습니다._exit()또는abort().abort()는 프로그램을 즉시 정지하고 스택트레이스를 취득할 목적으로 디버깅모드에서 대부분 도움이 됩니다(모템 후 분석용).그것은 보통 뒤에 숨겨져 있다.assert()매크로가 활성화 되는 것은 디버깅모드뿐이에요

exit()는 언제 도움이 됩니까?

exit()아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 맞다.복구 불가능한 문제가 발생하여 코드가 더 이상 유용한 작업을 수행할 수 없는 경우 오류 관리에 도움이 될 수 있습니다.제어 플로우가 복잡하고, 에러 코드를 완전하게 전파할 필요가 있는 경우에 편리합니다.그러나 이는 잘못된 코딩 관행임을 유의하십시오.프로세스를 사일런트하게 종료하는 것은 대부분의 경우 동작이 더 나빠지고 실제 오류 관리가 선호됩니다(또는 예외를 사용하는 C++).

의 다이렉트 콜:exit()라이브러리에서 실행되면 특히 나쁠 수 있습니다.라이브러리 사용자는 에러 리커버리를 실행할지 여부를 라이브러리 사용자가 선택해야 합니다.「」를 호출하는 할 필요가 있는 .exit()도서관은 좋지 않다, 예를 들어 사람들이 이 질문을 하게 만든다.

의 여지가 없는 .exit()자녀 프로세스를 지원하는 운영체제시스템에서 fork()에 의해 시작된 자녀 프로세스를 종료하는 방법입니다.보통 fork() 이전의 코드로 돌아가는 것은 좋지 않습니다.이것은 exec() 패밀리의 함수가 발신자에게 돌아오지 않는 이유를 설명하는 근거입니다.

두 가지 프로그램을 작성했습니다.

int main(){return 0;}

그리고.

#include <stdlib.h>
int main(){exit(0)}

" " " 후gcc -S -O1[ ] ( [ ]) : ]

main:
    movl    $0, %eax    /* setting return value */
    ret                 /* return from main */

그리고.

main:
    subq    $8, %rsp    /* reserving some space */
    movl    $0, %edi    /* setting return value */
    call    exit        /* calling exit function */
                        /* magic and machine specific wizardry after this call */

은 '사용하다' 입니다return수 있을 때, 및 「」를 참조해 주세요.exit()필요할 때.

C 에 、 로 、 로 、 be be be 로 be ( ( ( ( ( ( ( ( ( ( ( 이 이 이 이 이 이 이 이 이 이 이 이 이 이 이 이 in in in in in in in in in of of of of of of of of of of of of of of of of of of main(),wmain(),_tmain()는는컴컴컴컴컴사사사사사사기기기이)

당신이 가 if if if ifreturnmain()는 다시 제제로 the the the the the the the the로 돌아갑니다._start()C이는 C를 호출하면, C가 호출됩니다.exit()을 사용하든.그래서 어떤 것을 사용하든 상관없습니다.

return 문은 현재 함수를 종료하고 exit()은 프로그램을 종료합니다.

they are the same when used in main() function

또한 return은 스테이트먼트이며 exit()는 stdlb.h 헤더파일이 필요한 함수입니다.

언급URL : https://stackoverflow.com/questions/3463551/what-is-the-difference-between-exit-and-return

반응형