return 스테이트먼트 vs exit() in main()
쓸까요?exit()아니면 그냥return에 기재되어 있는 스테이트먼트main()개인적으로는return다른 기능을 읽는 것 같고 코드를 읽을 때 흐름 제어가 원활하다고 느끼기 때문입니다.그리고 심지어 내가 리팩터링하고 싶어도main()기능, 보유return보다 좋은 선택인 것 같다exit().
한다exit()하는 특별한 일을 하다return안 그래?
사실은 차이가 있지만, 그것은 미묘하다.이것은 C++에 더 많은 영향을 미치지만 차이는 중요합니다.
내가 전화했을 때return에main()destructors는 로컬 스코프의 오브젝트에 대해 호출됩니다.내가 전화하면exit()로컬 스코프의 오브젝트에 대해 디스트럭터가 호출되지 않습니다.다시 읽어봐 exit() 는 돌아오지 않습니다.그 말은 내가 한 번 부르면 '후견인'이 없다는 거야.해당 함수로 만든 개체는 삭제되지 않습니다.대부분의 경우, 이것은 영향을 미치지 않지만 파일을 닫는 것과 같이 영향을 미칠 수 있습니다(모든 데이터를 디스크에 플러시해야 합니다).
주의:static호출해도 오브젝트가 정리됩니다.exit()마지막으로 주의하세요.abort()오브젝트는 파기되지 않습니다.즉, 글로벌 객체, 정적 객체 및 로컬 객체에는 소멸자가 호출되지 않습니다.
반환보다 종료를 선호할 경우 주의하여 진행하십시오.
http://groups.google.com/group/gnu.gcc.help/msg/8348c50030cfd15a
또 다른 차이점:exit는 표준 라이브러리 함수이므로 헤더를 포함하여 표준 라이브러리와의 링크를 포함해야 합니다.(C++로) 설명하려면 , 다음의 프로그램이 유효합니다.
int main() { return 0; }
쓰려면exit다음 항목이 필요합니다.
#include <stdlib.h>
int main() { exit(EXIT_SUCCESS); }
또, 콜이라는 전제 조건도 추가되고 있습니다.exit부터main0을 반환하는 것과 같은 부작용이 있습니다.다른 사람들이 지적한 바와 같이, 이것은 작성하는 실행 파일의 종류에 따라 다릅니다(즉, 문의처의 사람).mainC-runtime을 사용하는 앱을 코드화하고 있습니까?마야 플러그인?윈도 서비스?운전기사?각각의 케이스에 대해 조사해야 합니다.exit와 동등하다return. IMHO 사용exit정말이라면 return코드를 더 혼란스럽게 만들 뿐이죠OTOH, 만약 당신이 정말로 exit그럼 꼭 사용하세요.
적어도 한 가지 이유가 있습니다.exit: 고객님의 고객 중 한 분이라도atexit핸들러란, 자동 격납 데이터를 참조합니다.main, 또는 를 사용하고 있는 경우setvbuf또는setbuf표준 스트림 중 하나에 자동 저장 버퍼를 할당하다main, 그 후 에서 돌아오다main정의되지 않은 동작을 생성하지만,exit유효합니다.
또 다른 잠재적 사용법(일반적으로 장난감 프로그램용으로 예약됨)은 재귀 호출을 통해 프로그램을 종료하는 것입니다.main.
는 항상 는는항 i i i i i i i i i를 쓴다.return왜냐하면 표준 시제품은main()는, 「」를 것을 있습니다.int.
에서는 「」, 「」, 「」가 부여되고 있습니다.main하면 0이 됩니다.return다음 코드가 지정됩니다.
int foo() {}
int main(int argc, char *argv[]) {}
G는 G++에 대한 만 생성합니다.foo()합니다.main:
% g++ -Wall -c foo.cc
foo.cc: In function ‘int foo()’:
foo.cc:1: warning: control reaches end of non-void function
R.의 exit() 사용에 대한 코멘트를 강력히 지지합니다.이것에 의해, 자동 격납이 행해지지 않게 됩니다.main()프로그램이 실제로 종료되기 전에 회수됩니다. a.return X;입니다.main()는, 「」에의.exit(X);「」의 다이나믹 main()를 감춘다main()반환되지만 콜이 .exit()대신 만들어졌어요.
C 에서는 C가 사용됩니다.return이단, 이 의 계속은 통상, 「」를 호출한 C 의 루틴을 , 합니다.main()기능, 프로세스를 종료할 때 의미하는 바가 정확히 다릅니다.
경우, except 의 기능에서 종료합니다.main()전화해야 합니다exit() in . .서 . . . . . . . . . . 。main()더 읽을 수 , 할 수 . 카피(가 더 쉬워집니다. 또한 다른 사용자가 코드를 재인수하는 것이 훨씬 더 쉽습니다. 즉, 코드 복사main()return했어야 할 진술exit()콜을 클릭합니다.
그래서, 이 모든 점들을 종합하면, 결론은 적어도 C에게 나쁜 습관이라는 것입니다.return을 .main().
exit()는 'return'이 하지 않는 특별한 일을 합니까?
이지 않은 경우exit()되는 경우가 있습니다.main()는 변환 없이 호스트 환경에 직접 값을 전달할 수 있습니다.
가 있습니다(구체적으로는 int. -호환성이 있습니다.main()하는 것과 같아야 .exit()( 「 「 」 )는, OS 마다 값을 것입니다.문제는 OS마다 exit 값을 해석하는 규칙이 다르다는 것입니다.많은 (MANY!) 시스템에서 0은 성공을 의미하고 다른 것은 실패를 의미합니다.그러나 VMS의 경우 홀수 값은 성공을 의미하고 1개라도 실패를 의미합니다.에서 main()VMS 사용자에게는 액세스 위반에 관한 불쾌한 메시지가 표시됩니다.실제로 액세스 위반은 없었습니다.이것은 단순히 장애 코드0과 관련된 표준 메시지입니다.
그 후 ANSI가 나타나 축복했다.EXIT_SUCCESS그리고.EXIT_FAILURE당신이 전달할 수 있는 논쟁으로서exit()기준에는 다음과 같은 내용도 있습니다.exit(0)와 똑같이 행동해야 한다exit(EXIT_SUCCESS)대부분의 구현에서는EXIT_SUCCESS로.0.
따라서 이 표준에서는 값이 0인 장애 코드를 반환할 수 있는 표준 방법이 없기 때문에 VMS에 제약이 있습니다.
따라서 1990년대 초반의 VAX/VMS C 컴파일러는 다음 값에서 반환되는 값을 해석하지 않았습니다.main()호스트 환경에 대한 모든 가치를 되돌리기만 하면 됩니다.하지만 만약 당신이exit()표준이 요구하는 대로 번역할 수 있습니다.번역EXIT_SUCCESS(또는0)를 성공 코드로 변환하여EXIT_FAILURE일반적인 장애 코드로 변환합니다.사용방법EXIT_SUCCESS에 전달해야 합니다.exit(), 에서 반품할 수 없었습니다.main()그 컴파일러의 최신 버전이 그 동작을 유지했는지 모르겠습니다.
휴대용 C 프로그램은 다음과 같이 생겼습니다.
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Hello, World!\n");
exit(EXIT_SUCCESS); /* to get good return value to OS */
/*NOTREACHED*/ /* to silence lint warning */
return 0; /* to silence compiler warning */
}
예외: 내 기억이 맞다면 종료 값에 대한 VMS 규약은 홀수/짝수보다 더 미묘한 차이가 있습니다.실제로는 하위 3비트와 같은 것을 사용하여 중대도를 부호화합니다.그러나 일반적으로 홀수 심각도 수준은 성공 또는 기타 정보를 나타내며 짝수 심각도 수준은 오류를 나타냅니다.
에서 돌아오는 C의 경우main호출과 완전히 동일합니다.exit같은 값입니다.
C 표준의 섹션 5.1.2.3에는 다음과 같이 기술되어 있다.
메인 함수의 반환 유형이 int와 호환되는 유형인 경우, 초기 호출에서 메인 함수로의 반환은 메인 함수에 의해 반환된 값을 인수로 하여 exit 함수를 호출하는 것과 같습니다.메인 함수를 종료하는 }에 도달하면 0의 값이 반환됩니다.반환 유형이 int와 호환되지 않으면 호스트 환경으로 반환되는 종료 상태가 지정되지 않습니다.
C++의 규칙은 다른 답변에서 언급했듯이 조금 다릅니다.
사실 이 두 가지 사이에는 차이가 있다.exit(0)그리고.return(0)에main– 고객님의 고객님이main함수를 여러 번 호출합니다.
다음 프로그램
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
if (argc == 0)
return(0);
printf("%d", main(argc - 1, argv));
}
로서 실행
./program 0 0 0 0
다음과 같은 출력이 발생합니다.
00000
단, 이 경우:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
if (argc == 0)
exit(0);
printf("%d", main(argc - 1, argv));
}
인수에 관계없이 아무것도 인쇄하지 않습니다.
아무도 전화하지 않을 거라고 확신한다면main일반적으로 기술적으로 큰 차이는 없지만 보다 명확한 코드를 유지하는 것이 중요합니다.exit훨씬 나아보일 거예요.어떤 이유로 전화하시려면main– 필요에 따라 조정해야 합니다.
C에 대해서 말하자면.
언급URL : https://stackoverflow.com/questions/461449/return-statement-vs-exit-in-main
'source' 카테고리의 다른 글
| Java 애플리케이션 내부에서 VM 인수를 가져오려면 어떻게 해야 합니까? (0) | 2022.07.30 |
|---|---|
| vue-cli-service build 명령을 사용하여 자산을 복사하는 방법 (0) | 2022.07.30 |
| -g 플래그에도 불구하고 Valgrind에 행 번호가 표시되지 않음(Ubuntu 11.10/Virtual Box) (0) | 2022.07.30 |
| 시간 초과 재설정(vuetify 스낵바) (0) | 2022.07.30 |
| 반복기와 반복기의 차이점과 사용법은 무엇입니까? (0) | 2022.07.30 |