문제

내가 사용해야할까요 exit() 아니면 그냥 return 진술 main()? 개인적으로 나는 return 진술은 다른 기능을 읽는 것과 같아서 코드를 읽을 때 흐름 제어가 부드럽습니다 (내 의견으로는). 그리고 내가 리팩터를 리팩터링하고 싶더라도 main() 기능, return 보다 더 나은 선택처럼 보입니다 exit().

하다 exit() 특별한 일을하십시오 return 그렇지 않습니까?

도움이 되었습니까?

해결책

사실, 거기 ~이다 차이점이지만 미묘합니다. C ++에 더 많은 영향을 미치지 만 차이가 중요합니다.

내가 전화 할 때 return 안에 main(), 소멸자는 내 지역적으로 범위를 가진 물건을 요구받을 것입니다. 내가 전화하면 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 ~에서 main 반환 0과 같은 부작용이 있습니다. 다른 사람들이 지적했듯이, 이것은 당신이 짓는 어떤 종류의 실행 가능에 따라 다릅니다 (즉, 누가 전화하는 사람 main). C-Runtime을 사용하는 앱을 코딩하고 있습니까? Maya 플러그인? Windows 서비스? 운전자? 각 사례는 확인하기위한 연구가 필요합니다 exit 동일합니다 return. IMHO 사용 exit 때를 정말 의미가 있습니다 return 코드를 더 혼란스럽게 만듭니다. 오토, 당신이 있다면 정말 의미가 있습니다 exit, 그런 다음 꼭 사용하십시오.

선호해야 할 이유가 하나 이상 있습니다 exit: 당신의 경우 atexit 핸들러는 자동 스토리지 기간 데이터를 참조합니다 main, 또는 사용한 경우 setvbuf 또는 setbuf 표준 스트림 중 하나에 자동 스토리지 기간 버퍼를 할당하려면 main, 돌아온다 main 정의되지 않은 동작을 생성하지만 호출 exit 유효합니다.

또 다른 잠재적 인 사용법 (일반적으로 장난감 프로그램을 위해 예약)은 main.

나는 항상 사용합니다 return 표준 프로토 타입 때문입니다 main() 반환한다고 말합니다 int.

즉, 일부 버전의 표준은 제공합니다 main 특별한 대우 및 명시 적이 없으면 0이 반환된다고 가정합니다. return 성명. 다음 코드가 주어지면 :

int foo() {}
int main(int argc, char *argv[]) {}

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() 프로그램이 실제로 종료되기 전에 재생됩니다. ㅏ return X; 진술 main() 전화와 정확히 동일하지 않습니다 exit(X);, 동적 저장 이후 main() 언제 사라집니다 main() 반환하지만 전화를 걸면 사라지지 않습니다. exit() 대신 만들어집니다.

또한, C 또는 임의의 언어 a return 진술은 독자에게 호출 함수에서 실행이 계속 될 것이라고 강력하게 암시하며,이 실행 연속은 일반적으로 귀하가 귀하의 C 스타트 업 루틴을 계산하는 경우 일반적으로 기술적으로 사실입니다. main() 기능, 그것은 정확히 무엇이 아닙니다 프로세스를 끝내는 것을 의미 할 때를 의미합니다.

결국, 다른 기능 내에서 프로그램을 끝내고 싶다면 main()~ 해야 하다 전화 exit(). 일관되게 그렇게합니다 main() 또한 코드를 훨씬 더 읽기 쉽게 만들 수 있으며 누구나 코드를 재신하게하는 것이 훨씬 쉬워집니다. IE 코드에서 복사 main() 다른 기능은 우발적으로 인해 잘못 행동하지 않습니다 return 진술 ~해야 한다 해왔다 exit() 전화.

따라서이 모든 점을 함께 결합하는 것은 결론이 나쁜 습관, 적어도 C의 경우 a return 프로그램을 종료하는 진술 main().

exit ()는 '반환'이 아닌 특별한 일을합니까?

드문 플랫폼을위한 일부 컴파일러와 함께 exit() 반환하는 동안 인수를 프로그램의 종료 가치로 변환 할 수 있습니다. main() 번역없이 값을 호스트 환경으로 직접 전달할 수 있습니다.

표준은 이러한 경우에 동일한 행동이 필요합니다 (특히, 무언가를 반환하는 것을 말합니다. int-호출 가능 main() 전화와 동일해야합니다 exit() 그 가치와 함께). 문제는 OS가 다른 OS마다 종료 값을 해석하기 위해 다른 규칙이 있다는 것입니다. 많은 (많은!) 시스템에서 0은 성공을 의미하며 다른 것은 실패입니다. 그러나 VMS에서 홀수 값은 성공을 의미하며 심지어는 실패를 의미합니다. 당신이 0에서 반환 한 경우 main(), VMS 사용자는 액세스 위반에 대한 불쾌한 메시지를 볼 수 있습니다. 실제로 액세스 위반이 없었습니다. 이는 단순히 실패 코드 0과 관련된 표준 메시지였습니다.

그런 다음 Ansi가 와서 축복을 받았습니다 EXIT_SUCCESS 그리고 EXIT_FAILURE 당신이 통과 할 수있는 주장으로 exit(). 표준은 또한 그렇게 말합니다 exit(0) 동일하게 행동해야합니다 exit(EXIT_SUCCESS), 대부분의 구현은 정의됩니다 EXIT_SUCCESS 에게 0.

그러므로 표준은 VM에 바인드를 넣습니다. 실패 값이 0 인 코드.

1990 년대 초반 ERA 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 같은 값으로.

5.1.2.2.3 절 C 표준 상태 :

기본 함수의 리턴 유형이 int와 호환되는 유형 인 경우 초기 호출에서 기본 기능으로의 반환은 기본 기능에 의해 반환 된 값을 인수로 사용하여 종료 함수를 호출하는 것과 같습니다.; 11) 메인 함수가 끝나는}에 도달하는} 값이 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));
}

AS로 실행하십시오

./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에 대해 말하기

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top