Programming

main ()에서 EXIT_SUCCESS 또는 0을 반환해야합니까?

procodes 2020. 8. 13. 21:41
반응형

main ()에서 EXIT_SUCCESS 또는 0을 반환해야합니까?


그것은 간단한 질문입니다,하지만 난 충돌 답변을보고 계속 :해야 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 == 나쁘다고 가정 할 수 있습니다.하지만 아닙니다. 대부분의 숙련 된 개발자에게는 문제가되지 않습니다. 하지만 왜 전혀 이유없이 새로운 사람을 넘어 뜨릴까요?

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 ...


EXIT_SUCCESS를 사용하면 코드의 이식성이 향상됩니다.

http://www.dreamincode.net/forums/topic/57495-return-0-vs-return-exit-success/


일부 컴파일러는 이것에 문제를 일으킬 수 있습니다 .Mac C ++ 컴파일러에서는 EXIT_SUCCESS가 잘 작동했지만 Linux C ++ 컴파일러에서는 EXIT_SUCCESS가 무엇인지 알기 위해 cstdlib를 추가해야했습니다. 그 외에는 하나이고 동일합니다.


0 == 거짓 && 거짓 == EXIT_SUCCESS

In practice, I don't think it makes much of a difference. -- but Main is defined as an int, so it would seems logical for main to return an int. Under some circumstances, you might want to return different ints for different errors, and it would seem weird to give one a fancy name.

참고URL : https://stackoverflow.com/questions/8867871/should-i-return-exit-success-or-0-from-main

반응형