반응형

몇몇 컴파일러(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

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

+ Recent posts