main ()에서 EXIT_SUCCESS 또는 0을 반환해야합니까? 함께 사용해야합니까 exit()? EXIT_SUCCESS다른 소프트웨어가

그것은 간단한 질문입니다,하지만 난 충돌 답변을보고 계속 :해야 C ++ 프로그램 수익의 메인 루틴 0이나 EXIT_SUCCESS?

#include <cstdlib>
int main(){return EXIT_SUCCESS;}

또는

int main(){return 0;}

똑같은가요? EXIT_SUCCESS와 함께 사용해야합니까 exit()?

EXIT_SUCCESS다른 소프트웨어가 0을 실패로 간주 할 수 있기 때문에 더 나은 옵션 이라고 생각 했지만을 반환 0하면 컴파일러가 어쨌든 다른 값으로 변경할 수 있다고 들었 습니다.



답변

EXIT_FAILURE의 return 문에서 main또는에 대한 인수로 사용 exit()되는은 C 또는 C ++ 프로그램에서 실패를 나타내는 유일한 이식 가능한 방법입니다. exit(1)예를 들어 실제로 VMS에서 성공적인 종료를 알릴 수 있습니다.

당신이 사용하는 거라면 EXIT_FAILURE프로그램이 실패하면, 당신은뿐만 아니라 사용할 수 있습니다 EXIT_SUCCESS성공할 때 단지 대칭을 위해.

프로그램이 실패 신호 결코 다른 한편, 만약, 당신도 사용할 수 있습니다 0또는 EXIT_SUCCESS. 둘 다 성공적인 완료를 알리기 위해 표준에 의해 보장됩니다. ( EXIT_SUCCESS0 이외의 값을 가질 수는 거의 없지만 내가 들어 본 모든 구현에서 0과 같습니다.)

사용 0#include <stdlib.h>C 또는 #include <cstdlib>C ++에서 필요하지 않은 사소한 이점이 있습니다 (를 return호출하는 대신 명령문을 사용하는 경우 exit())-그러나 상당한 크기의 프로그램의 경우 stdlib를 직접 또는 간접적으로 포함하게됩니다. 어쨌든.

그 문제에 대해 1999 표준부터 시작하는 C와 모든 버전의 C ++에서 끝에 도달하면 어쨌든 main()암시 return 0;적이므로 둘 중 하나 0또는 EXIT_SUCCESS명시 적으로 사용할 필요가 없습니다 . (하지만 적어도 C에서는 명시 적 return 0;스타일이 더 나은 스타일 이라고 생각합니다 .)

(누군가는 내가 오랫동안 그것을 사용하지 않았습니다. OpenVMS의에 대해 물었지만, 심지어 값은 실패를 의미하는 동안 일반적으로 나타낸다 성공 이상한 상태 값을 기억한다. C 구현은 매핑 01그, 그래서 return 0;성공적인 종료를 나타냅니다. 다른 값이 변경 전달 , 따라서 return 1;성공적인 종료를 나타냅니다. EXIT_FAILURE짝수 값이 0이 아닙니다.)


답변

그것은 중요하지 않습니다. 둘 다 동일합니다.

C ++ 표준 인용문 :

status 값이 0 또는 EXIT_SUCCESS 인 경우, 성공적으로 종료 된 상태의 구현 정의 형식이 반환됩니다.


답변

0은 정의에 따라 매직 넘버입니다. EXIT_SUCCESS는 거의 보편적으로 0과 같습니다. 그렇다면 그냥 0으로 돌아가거나 나가지 않는 이유는 무엇입니까?

exit (EXIT_SUCCESS); 의미가 풍부합니다.

exit (0); 반면에 어떤면에서는 반 직관적입니다. 쉘 동작에 익숙하지 않은 사람은 C에서 0의 다른 모든 사용과 마찬가지로 0 == false == 나쁘다고 가정 할 수 있습니다. 그러나 아니요-이 특별한 경우에는 0 == 성공 == 좋습니다. 대부분의 숙련 된 개발자에게는 문제가되지 않습니다. 하지만 왜 전혀 이유없이 새로운 사람을 넘어 뜨릴까요?

tl; dr-매직 넘버에 대해 정의 된 상수가있는 경우 처음에 상수를 사용하지 않을 이유가 거의 없습니다. 검색 가능성이 더 높고, 종종 더 명확하며, 비용이 들지 않습니다.


답변

이것은 “모든 것에 대한 상호 운용성 및 이식성”의 한계 (신화)를 반영하는 끝없는 이야기입니다.

“성공”을 나타 내기 위해 프로그램이 반환해야하는 것은 언어 사양이 아닌 값을받는 사람 (운영 체제 또는 프로그램을 호출 한 프로세스)에 의해 정의되어야합니다.

그러나 프로그래머는 “이동 가능한 방식”으로 코드를 작성하기를 좋아하므로 반환 할 기호 값을 정의하는 “운영 체제”개념에 대한 자체 모델을 발명합니다.

이제 다 대다 시나리오 (많은 언어가 많은 시스템에 프로그램을 작성하는 역할을하는 경우)에서 “성공”에 대한 언어 규칙과 운영 체제 1 (아무도 항상 동일하다고 허용 할 수 없음) 간의 대응이 이루어져야합니다. 특정 대상 플랫폼에 대한 라이브러리의 특정 구현에 의해 처리됩니다.

그러나-불행히도-C 언어가 배포되었을 때 (주로 UNIX 커널을 작성하기 위해) 명확하지 않은이 개념과 “return 0은 성공을 의미합니다”라고 쓰여진 책의 기가 그램은 OS에서 사실 이었기 때문에 그 시간에는 C 컴파일러가 있습니다.

그 이후로 그러한 서신을 어떻게 처리해야하는지에 대한 명확한 표준화가 이루어지지 않았습니다. C와 C ++에는 “반환 값”에 대한 자체 정의가 있지만 적절한 OS 번역을 제공하는 사람은 없습니다 (또는 더 나은 방법 : 이에 대해 설명하는 컴파일러 문서는 없음). 0은 UNIX (LINUX) 및-독립적 인 이유로-Windows에서도 true이면 성공을 의미합니다. 이는 대부분의 경우 반환 값을 무시하는 기존 “소비자 컴퓨터”의 90 %를 포함합니다. 수십 년 동안 토론하면 아무도 눈치 채지 못할 것입니다!)

이 시나리오 내에서 결정을 내리기 전에 다음과 같은 질문을하십시오.-내 기존에 대해 발신자에게 무언가를 알리고 싶은가? (내가 항상 0을 반환한다면 … 모든 것에 대한 단서가 없습니다)-내 발신자 가이 통신에 대한 규칙을 가지고 있습니까? (단일 값은 규칙이 아닙니다. 정보 표현을 허용하지 않습니다.)

이 두 가지 대답이 모두 ‘아니요’라면 좋은 해결책은 주 return 문을 전혀 작성하지 않는 것입니다. (그리고 컴파일러가 타겟에 대해 결정하게하십시오).

규칙이없는 경우 0 = 성공은 대부분의 상황을 충족합니다 (규칙을 도입하는 경우 기호 사용은 문제가 될 수 있음).

규칙이있는 경우, 그 규칙과 일관된 기호 상수를 사용하고 플랫폼간에 값 일관성이 아닌 규칙 일관성을 보장하십시오.


답변

수많은 종료 상태를 반환 할 수있는 코드를 작성하기 시작하면 #define모든 종료 상태를 시작 합니다. 이 경우 EXIT_SUCCESS매직 넘버 ” 가 아닌 맥락에서 의미가 있습니다. 이렇게하면 다른 모든 종료 코드가 EXIT_SOMETHING. 완료되었을 때 반환되는 프로그램을 작성하는 경우, return 0유효하며 정교한 반환 코드 구조가 없음을 나타 내기 때문에 아마도 더 깔끔 할 것입니다.


답변

프로그램에서 반환하는 것은 단지 관례 일뿐입니다.

아니요, “EXIT_SUCCESS” “0” 이 아닌 상황은 생각할 수 없습니다 .

개인적으로는 “0”을 추천합니다.

IMHO …