몇몇 컴파일러(VC++ 6.0, VC++ 2005 등... ) 에서 int main() 과 void main() 이 둘다 컴파일 에러없이 잘 동작하는 반면, dev C++, g++ 과 같은 컴파일러에서는 void main() 은 컴파일 에러를 낸다. 늘 습관처럼 int main() 을 쓰던터라 이번기회에 int main() 과 void main() 의 차이에 대해 자세히 찾아보았다.

우선 결론부터 말하자면 int main() 이 C/C++ 표준에 맞는 표기이며, void main() 은 잘못된 표기인 것이다.

int main()
{
 return 0;
}

위의 코드에서 return 0 의 역활은 main() 함수가 정상적으로 종료됨을 의미하는 exit(0) 을 호출하고 main() 함수를 종료하게 된다. exit 의 파라미터인 status 값은 컴파일러마다 약간씩 다르게 정의되어 있으나 일반적으로 0 이면 정상종료를 의미하며 0 이외의 숫자는 pre-defined 된 각각의 에러 타입을 의미한다.
참고로 Visual C++ 2005 에서는 이 status 가 다음과 같이 STDLIB.H 에 정의되어 있다.
#define EXIT_SUCCESS    0
#define EXIT_FAILURE    1

그러므로 void main() 으로 코딩을 한다면 설사 컴파일러가 컴파일 에러를 발생시키지 않는다 할지라도 프로세스 상에서는 main() 이 올바르지 않은 종료조건을 OS 에 리턴하고 자신을 종료할 가능성이 있게 된다.

왜 그렇다면 많은 서적과 예제에서 여전히 잘못된 표기인 void main() 을 쓰고 있을까?

초창기의 C 에서는 void 타입의 함수란 존재하지 않았으며, return 이 의미가 없는 경우에는 int 형 garbage 를 리턴하는 함수를 썼다 한다. 초기의 이러한 전통때문에 리턴값이 별 의미없는 int 형 함수들이 시간이 지나면서 프로그래머들의 취향에 따라 void 형 함수들로 고쳐 사용되었는데 이 과정에서 main() 함수도 void main() 으로 많이 사용되어진 것이 아닌가 추측된다. void main() 으로 실행할 경우 default 로 정상종료를 시키는 컴파일러들이 많아짐에 따라 프로그래머들은 별 문제 없이 이러한 코딩습관을 갖게 되었고, 사용자들이 이런 습관대로 쓰는 경우가 많아지자 컴파일러 제작사들도 사용자들의 습관에 따라 void main() 을 warning 이나 컴파일 에러없이 컴파일 되도록 만들게 되었다... 이것이 유력한 주장이다.

참고 : http://www.eskimo.com/~scs/readings/voidmain.960823.html

또다른 참고 : http://libe.tistory.com/2861180

사실 이건 그렇게 대단한 이슈는 아니지만 가끔 궁금해하는 사람들이 있어서 정리해 보았다. 약간 귀찮더라도 코딩은 표준대로 쓰는 것이 향후의 이식성을 고려할 때 좋을 것 같다 = )

댓글을 달아주세요!
  1. BlogIcon Hikikomori 2007.09.30 09:32 신고  댓글주소  수정/삭제  댓글쓰기

    히히, 전 이제 막 씨언어 접한 학생인데,
    학교에선 맨날 교수님이 Visual C 로, 문자 출력시에 void main()을 쓰더라구요,
    전 dev++에 익숙해서 그런지 맨날 void 쓰니까 막햇갈려서,
    그래서 그냥 int main() 이것만 써요,ㅋ

    왜 그럴까 궁금했는데, 이제 쫌 알겠어요, 게시글 굿또!

  2. BlogIcon hyperdash 2007.10.02 01:06 신고  댓글주소  수정/삭제  댓글쓰기

    호옷... 이거 1학년때가 생각나는군....
    k = 1;
    k++ + ++k = ?
    ++k + k++ = ?
    뭐 이런거 고민하고 그랬었지...

  3. skyblueang 2008.11.07 13:19 신고  댓글주소  수정/삭제  댓글쓰기

    잘보고 갑니다~
    좋은내용이라 퍼갑니다~ ^^

  4. BlogIcon merovingian 2008.12.23 22:17 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 내용 잘 보고 갑니다. 퍼가요~

  5. tk 2014.03.06 21:57 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 공부 됐어요! 이제 막 c언어 배우는 차에 int main과 void main 을 보고 혼란스러워하던 차에 이런 큰 도움을.

    사실 전부 이해는 못하겠지만 더이상 혼란스럽진 않게 됐습니다.

    고맙습니다.

  6. 아무것도몰라요 2015.03.10 23:05 신고  댓글주소  수정/삭제  댓글쓰기

    어... 그러면 지금은 C++쪽에서도 void main()이 쓰이고 있다는 말인가요???
    아니면 int main()만 쓰이는 건가요??

이름 암호 홈페이지