c 언어 int main 함수에서의 return 0;가 없어도 되는 이유

sangjun11316의 이미지

안녕하세요, 'c에서 int main 을 쓸 때 끝부분에 return 0;를 써 두는 것이 좋다' 라고 흔히들 말하고, return을 쓰고 싶지 않을 때는 void를 쓰는게 일반적이지요.

그런데 저는 현재까지 c언어에 대해 경험이 매우 짧아 int main 함수 뒤에 return 0; 이 없을 때 오류가 나는 경우를 경험하지 못했습니다.

다들 큰 구체적인 이유 없이'return 0;을 써 주는게 좋습니다'라고만 말씀하시고... stack 영역에 들어가 있는 데이터들이 return을 하면서 삭제되기 때문에 써 주는게 맞는 것 같긴 한데, 실제로는 return 없이도 컴파일 및 실행에 지장이 없는 구체적인 이유가 궁금합니다.

DarkSide의 이미지

컴파일러가 알아서 리턴 값을 써주기 때문에 경고만 나올뿐 실행은 됩니다.
정상적으로 프로그램이 종료했음을 나타내기 위해 return 0 를 써 주는게 좋다고 생각합니다.

sangjun11316의 이미지

컴파일러가 리턴값을 알아서 써주는군요. 감사합니다 ㅎㅎ

bushi의 이미지

컴파일러가 알아서 써 주지 않습니다.
다른 용도로 쓰던 찌꺼기 값이 그냥 남아있다가 caller 에게 읽히는 것 뿐이죠.

ifree의 이미지

일반적으로 정수를 반환하는 함수는 스택 상에 정수 값을 올려 놓고 함수를 호출한 장소로 되돌아 가며, 함수 호출부에서 스택을 다시 꺼내어 사용합니다.
따라서 이 스택 부분은 반드시 사용되어야 하죠. 즉 리턴 전에 반드시 푸시 동작이 이루어져야 프로그램이 정상 작동될 것입니다.

메인 함수가 아닌 정수를 리턴하는 일반 함수에 리턴을 생략하고 실행하면 일반적으로 기본 값이 출력되지만, 메인 함수의 경우에는 다소 다른 것 같습니다.

bushi의 이미지

스택으로 정수 값을 반환해야만 하는 이유를 가진 아키텍쳐는 본 적이 없습니다만,
아키텍쳐 불문하고 그렇게 구현된 컴파일러가 만에 하나 있을 수 있다고 친다면,
그 값 반환용 스택은 이미 예약된 곳이라 코드의 다른 곳에서 사용하지 않을 수도 있긴 하겠군요.

스택으로 반환값을 주고 받는 ABI 라... kernel 과 libc 사이의 system call 구현을 어떻게 해야 할 지 생각만으로도 신경질이 나네요.

아는체쟁이의 이미지

찌거기가 들어가는 것이 아니라, 컴파일러가 0넣어 주는 것 맞거든.

bushi의 이미지

C99 부터 그러네. 고맙다.

hsnks100의 이미지

오래된 글이지만 잘못된 내용이 있는 것 같아 댓글답니다.

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

sangjun11316의 이미지

답변 감사드립니다

익명 사용자의 이미지

return 0 을 하게되면, 쉘 상에서 $? 변수를 사용하여 프로램이 잘 종료 되었는지 판단을 할 수 있습니다.

대부분의 프로그램이 보편적으로 리턴값이 0이면 정상, 그외 값은 비정상 종료로 판단합니다.


댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.