출구와 귀국의 차이점은 무엇입니까? [복제]
이 질문에 이미 답변이 있습니다.
C 프로그램의 어느 곳에서나 호출 될 때 C 프로그래밍에서 return과 exit 문의 차이점은 무엇입니까?
- return 은 함수 호출에서 반환되는 언어의 명령어입니다.
- exit 는 현재 프로세스를 종료하는 시스템 호출 (언어 문이 아님)입니다.
둘 다 (거의) 동일한 일을 수행하는 유일한 경우 main()
는 main에서 리턴이 exit()
.
예 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
당신은 "F에서 돌아온다"를 결코 얻지 못한다. 또한 #include <stdlib.h>
라이브러리 함수를 호출 하는 데 필요한 사항에 유의하십시오 exit()
.
또한의 매개 변수 exit()
는 정수 (실행기 프로세스가 가져올 수있는 프로세스의 반환 상태입니다. 일반적인 사용은 성공의 경우 0이고 오류의 경우 다른 값)입니다.
return 문의 매개 변수는 함수의 반환 유형이 무엇이든 상관 없습니다. 함수가 void를 반환하면 함수 끝에서 반환을 생략 할 수 있습니다.
마지막으로, exit()
두 가지 맛 _exit()
과 exit()
. 양식 간의 차이점은 exit()
(및 기본에서 반환) 프로세스를 실제로 종료하기 전에 atexit()
또는 사용하여 등록 된 함수를 호출 on_exit()
하는 반면 _exit()
(from #include <unistd.h>
또는 동의어 인 _Exit from #include <stdlib.h>
)은 프로세스를 즉시 종료한다는 것입니다.
이제 C ++와 관련된 문제도 있습니다.
C ++는 함수를 종료 할 때 C보다 훨씬 많은 작업을 수행합니다 ( return
-ing). 특히 범위를 벗어나는 로컬 개체의 소멸자를 호출합니다. 대부분의 경우 프로그래머는 프로세스가 중지 된 후 프로그램의 상태를 크게 신경 쓰지 않으므로 할당 된 메모리가 해제되고 파일 리소스가 닫히는 등 큰 차이가 없습니다. 그러나 소멸자가 IO를 수행하는지 여부는 중요 할 수 있습니다. 예를 들어 OStream
로컬에서 생성 된 자동 C ++ 는 종료 호출시 플러시되지 않으며 플러시되지 않은 일부 데이터가 손실 될 수 있습니다 (반면 정적 데이터 OStream
는 플러시 됨).
좋은 오래된 C FILE*
스트림을 사용하는 경우에는 발생하지 않습니다 . 에서 플러시됩니다 exit()
. 사실, 규칙은 등록 된 종료 함수의 경우 FILE*
모든 정상 종료시 플러시 되는 규칙과 동일 합니다. 여기에는를 포함 exit()
하지만 호출 _exit()
이나 abort ()에 대한 호출 은 포함 되지 않습니다 .
또한 C ++는 함수에서 벗어나는 세 번째 방법 인 예외 발생을 제공한다는 점을 염두에 두어야합니다. 함수에서 나가는이 방법은 소멸자 를 호출합니다. 호출자 체인의 어느 곳에서도 잡히지 않으면 예외가 main () 함수로 이동하여 프로세스를 종료 할 수 있습니다.
Destructors of static C++ objects (globals) will be called if you call either return
from main()
or exit()
anywhere in your program. They wont be called if the program is terminated using _exit()
or abort()
. abort()
is mostly useful in debug mode with the purpose to immediately stop the program and get a stack trace (for post mortem analysis). It is usually hidden behind the assert()
macro only active in debug mode.
When is exit() useful ?
exit()
means you want to immediately stops the current process. It can be of some use for error management when we encounter some kind of irrecoverable issue that won't allow for your code to do anything useful anymore. It is often handy when the control flow is complicated and error codes has to be propagated all way up. But be aware that this is bad coding practice. Silently ending the process is in most case the worse behavior and actual error management should be preferred (or in C++ using exceptions).
Direct calls to exit()
are especially bad if done in libraries as it will doom the library user and it should be a library user's choice to implement some kind of error recovery or not. If you want an example of why calling exit()
from a library is bad, it leads for instance people to ask this question.
There is an undisputed legitimate use of exit()
as the way to end a child process started by fork() on Operating Systems supporting it. Going back to the code before fork() is usually a bad idea. This is the rationale explaining why functions of the exec() family will never return to the caller.
I wrote two programs:
int main(){return 0;}
and
#include <stdlib.h>
int main(){exit(0)}
After executing gcc -S -O1
. Here what I found watching at assembly (only important parts):
main:
movl $0, %eax /* setting return value */
ret /* return from main */
and
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 */
So my conclusion is: use return
when you can, and exit()
when you need.
In C, there's not much difference when used in the startup function of the program (which can be main()
, wmain()
, _tmain()
or the default name used by your compiler).
If you return
in main()
, control goes back to the _start()
function in the C library which originally started your program, which then calls exit()
anyways. So it really doesn't matter which one you use.
the return statement exits from the current function and exit() exits from the program
they are the same when used in main() function
also return is a statement while exit() is a function which requires stdlb.h header file
참고URL : https://stackoverflow.com/questions/3463551/what-is-the-difference-between-exit-and-return
'developer tip' 카테고리의 다른 글
ES6에서 super를 사용하지 않고 클래스를 확장하는 방법은 무엇입니까? (0) | 2020.09.16 |
---|---|
Windows 용 Git Bash에서 별칭을 설정하는 방법은 무엇입니까? (0) | 2020.09.16 |
getter 만 사용하는 자동화 된 속성, 설정할 수있는 이유는 무엇입니까? (0) | 2020.09.16 |
여러 RE 엔진을 사용하여 정규식을 테스트하려면 어떻게해야합니까? (0) | 2020.09.16 |
동기화되지 않은 명령 (0) | 2020.09.16 |