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


124

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

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

또는

int main(){return 0;}

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

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


이것이 귀하의 질문에 대답합니까? stackoverflow.com/questions/1188335/…
Blastfurnace

2
C90에 대한이 답변은 표준을 의역 - 0그리고 EXIT_SUCCESS모두 성공으로 해석됩니다.
ta.speot.is

앞으로 다른 사람이이 글을 읽을 것이라고 생각하기 때문에 여기에서 응답하겠습니다. 기본적으로 "올바른 C"가 어떻게 생겼는지에 대한 많은 패러다임이 있습니다. 일부 패러다임은 매크로보다 리터럴 사용을 선호합니다. 상수 문자 포인터. 다른 패러다임은 유형에 구애받지 않고 매크로 유형을 사용하여 상황이 급격히 변경 될 때 코드베이스를 변경하지 않아도됩니다. 예를 들어, 많은 -
드미트리

@Dmitry <계속> Windows API 유형 정의는 최신 플랫폼에서 올바르지 않지만 매크로이기 때문에 모든 유형을 매크로를 재정 의하여 작동하는 유형으로 쉽게 변경할 수 있으며 이러한 유형의 대부분은 정의에 따라 간단히 확장됩니다. (예 : int는 플랫폼에 따라 다릅니다). 요약하면, 리턴 코드가 중요하고 향후 변경 될 수있는 경우 EXIT_SUCCESS와 같은 것을 사용하십시오. 그렇지 않으면 0을 리턴하는 것이 마법의 숫자처럼 보일 수 있지만 여전히 완벽하게 유효한 표준 규칙입니다. 오류 코드는 다른 하나의 파이프 번호 결과 프로그램 대부분입니다 -
드미트리

@Dmitry <계속> 프로그램을 디버그하기 위해 오류 코드를 사용하는 것은 다소 약합니다. 0을 반환하면 프로그램을 조용히 중단시킬 수있는 처리되지 않은 오류가 발생하는 경우를 제외하고는 매우 쓸모없는 정보입니다. 정상적으로 반환되었는지 (0) 또는 자동 오류가 발생했는지 확인합니다. 숫자 반환은 입력에 따라 한 프로그램에서 다른 프로그램으로 0..255를 파이프하는 데 더 유용합니다. 그렇지 않으면 생각할 이유가 없습니다. 0을 반환하거나 void "init"호출을 인라인하는 미리 컴파일 된 메인을 사용하여 시각적으로 표시하지 않습니다. 쓸데없는 반환으로 당신을 귀찮게합니다.
Dmitry

답변:


151

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이 아닙니다.)


@KeithThompson VMS (OpenVMS?)와 관련하여 답변을 명확히 할 수 있습니다. 0과 1로 EXIT_SUCCESS / EXIT_FAILURE 관계가 명확하지 않습니다. 대신 홀수 / 짝수 값을 설명하겠습니다.
malat

@malat : 실제로 VMS를 사용하십니까?
Keith Thompson

아니요, 사용하지 않았습니다. wikipedia가 다른 표현을 사용했기 때문에 나는 정식 답변을 찾고있었습니다 .
MALAT

1
@Rhymoid : POSIX가 아닌 C로 지정됩니다.
Keith Thompson

1
@DeanP은 : 0EXIT_SUCCESS같은 값을 (내가 내 대답에 그 언급)이 보장되지만 모두 나타낸다 성공적으로 종료되지 않습니다. 을 사용하는 경우EXIT_SUCCESS 스타일이 더 좋지만 괜찮습니다. EXIT_FAILUREexit(0)
Keith Thompson 19

25

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

C ++ 표준 인용문 :

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


12
컴파일러에게는 중요하지 않지만 스타일의 문제로 중요 할 수 있습니다.
celtschk

2
@celtschk : 스타일의 문제는 인식 기반 (Non Standardized)이므로 차이로 간주되지 않습니다.
Alok Save

3
보장 할 수 없습니다 EXIT_SUCCESS == 0. 반면에 그렇게되지 않을 이유가 없습니다.
Keith Thompson

@KeithThompson : EXIT_SUCCESS == 0이라는 보장이없는 이유는 무엇입니까? 더 명확하게 설명해주세요.
소멸자

2
@PravasiMeet : 시스템에는 성공을 나타내는 둘 이상의 값이있을 수 있습니다.
Keith Thompson

11

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

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

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

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


0이 자동으로 나빠질 것이라고 예상하는 사람들에 대한 귀하의 의견은 무시할 수 있습니다. 많은 API는 stdlib에서도 성공에 0을 사용하고 실패에 0이 아닌 API를 사용합니다. 예 다음 stdlib ( fclose(), setvbuf(), ...), POSIX ( listen(), pthread_create(), pipe()...), 및 많은 많은 다른 라이브러리 (예를 들어, OpenGL을 [ glGetError()] ZLIB [ deflate()/ inflate()/ ..., SDL [ SDL_CreateWindowAndRenderer()/ ...], 및 더).
Tim Čas

2
물론, '성공'을 위해 0이 사용되는 다른 경우가 있지만 혼란스러워하는 것에 대해 그가 맞습니다.
Paul Wintz

10

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

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

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

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

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

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

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

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

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

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


4

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


0

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

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

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

IMHO ...


1
저는 10 년 동안 C ++를 프로그래밍 해 왔지만 여전히 0이 반환 값 측면에서 성공 또는 실패를 의미하는지 기억할 수 없습니다.
lahjaton_j

@lahjaton_j 이해합니다. 그것은 직관적이지 않기 때문이라고 생각합니다. 0거짓이며 많은 함수 0가 실패하거나 아무것도하지 않으면 반환 합니다.
의미-문제 19


-5

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


나는 Mac에서 EXIT_SUCCESS가 cstdlib를 포함하지 않고 작동한다는 것을 의미했습니다.
양손 잡 이용

4
경우 EXIT_SUCCESS중 하나를 포함하지 않고 일을 <stdlib.h>하거나 <cstdlib>, 다른 헤더는 직접 또는 간접적으로 정의해야합니다. C ++에서는 #include다른 표준 헤더에 대한 표준 헤더가 일반적입니다 . 이것이 오류없이 컴파일된다면 int main() { return EXIT_SUCCESS; }컴파일러는 아마도 버그가있을 것입니다.
Keith Thompson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.