c 언어 int main 함수에서의 return 0;가 없어도 되는 이유
글쓴이: sangjun11316 / 작성시간: 수, 2019/04/17 - 11:30오전
안녕하세요, 'c에서 int main 을 쓸 때 끝부분에 return 0;를 써 두는 것이 좋다' 라고 흔히들 말하고, return을 쓰고 싶지 않을 때는 void를 쓰는게 일반적이지요.
그런데 저는 현재까지 c언어에 대해 경험이 매우 짧아 int main 함수 뒤에 return 0; 이 없을 때 오류가 나는 경우를 경험하지 못했습니다.
다들 큰 구체적인 이유 없이'return 0;을 써 주는게 좋습니다'라고만 말씀하시고... stack 영역에 들어가 있는 데이터들이 return을 하면서 삭제되기 때문에 써 주는게 맞는 것 같긴 한데, 실제로는 return 없이도 컴파일 및 실행에 지장이 없는 구체적인 이유가 궁금합니다.
Forums:
컴파일러가 알아서 리턴 값을 써주기 때문에 경고만
컴파일러가 알아서 리턴 값을 써주기 때문에 경고만 나올뿐 실행은 됩니다.
정상적으로 프로그램이 종료했음을 나타내기 위해 return 0 를 써 주는게 좋다고 생각합니다.
답변감사합니다 ㅎㅎ
컴파일러가 리턴값을 알아서 써주는군요. 감사합니다 ㅎㅎ
컴파일러가 알아서 써 주지 않습니다.
컴파일러가 알아서 써 주지 않습니다.
다른 용도로 쓰던 찌꺼기 값이 그냥 남아있다가 caller 에게 읽히는 것 뿐이죠.
일반적으로
일반적으로 정수를 반환하는 함수는 스택 상에 정수 값을 올려 놓고 함수를 호출한 장소로 되돌아 가며, 함수 호출부에서 스택을 다시 꺼내어 사용합니다.
따라서 이 스택 부분은 반드시 사용되어야 하죠. 즉 리턴 전에 반드시 푸시 동작이 이루어져야 프로그램이 정상 작동될 것입니다.
메인 함수가 아닌 정수를 리턴하는 일반 함수에 리턴을 생략하고 실행하면 일반적으로 기본 값이 출력되지만, 메인 함수의 경우에는 다소 다른 것 같습니다.
스택으로 정수 값을 반환해야만 하는 이유를 가진
스택으로 정수 값을 반환해야만 하는 이유를 가진 아키텍쳐는 본 적이 없습니다만,
아키텍쳐 불문하고 그렇게 구현된 컴파일러가 만에 하나 있을 수 있다고 친다면,
그 값 반환용 스택은 이미 예약된 곳이라 코드의 다른 곳에서 사용하지 않을 수도 있긴 하겠군요.
스택으로 반환값을 주고 받는 ABI 라... kernel 과 libc 사이의 system call 구현을 어떻게 해야 할 지 생각만으로도 신경질이 나네요.
아는체쟁이
찌거기가 들어가는 것이 아니라, 컴파일러가 0넣어 주는 것 맞거든.
C99 부터 그러네. 고맙다.
C99 부터 그러네. 고맙다.
오래된 글이지만 잘못된 내용이 있는 것 같아
오래된 글이지만 잘못된 내용이 있는 것 같아 댓글답니다.
return 0 가 없다고 경고가 나오는 것은 컴파일러마다 다르겠지만, 일반적으로 틀린 내용입니다. 대부분의 컴파일러
는 해당 내용을 경고 없이 넘어갈겁니다.
현재 표준에서는
5.1.2.2.3 Program termination
If the return type of the main function is a type compatible with int, a return from the
initial call to the main function is equivalent to calling the exit function with the value
returned by the main function as its argument;11) reaching the } that terminates the
main function returns a value of 0. If the return type is not compatible with int, the
termination status returned to the host environment is unspecified.
Forward references: definition of terms (7.1.1), the exit function (7.22.4.4).
바꿔 말하면 "int main 함수는 return 0 을 생략해도 된다" 는 것이 표준입니다. 적어도 C99 표준을 따른다면요. C11 표준에서도 해당 내용은 변하지 않았습니다.
또한
return을 쓰고 싶지 않을 때는 void를 쓰는게 일반적이지요.
아닙니다. 반드시 int main 형태로 작성해야 합니다. 이를 허용해주는것이 비표준이지만 대부분의 컴파일러들은 하위호환성을 위해 컴파일은 시켜줍니다.
----------------------------------------------------
개인 블로그: https://kangssu.com
감사합니다 ^^
답변 감사드립니다
return 0 을 하게되면, 쉘 상에서 $? 변수를
return 0 을 하게되면, 쉘 상에서 $? 변수를 사용하여 프로램이 잘 종료 되었는지 판단을 할 수 있습니다.
대부분의 프로그램이 보편적으로 리턴값이 0이면 정상, 그외 값은 비정상 종료로 판단합니다.
댓글 달기