몇몇 컴파일러(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
사실 이건 그렇게 대단한 이슈는 아니지만 가끔 궁금해하는 사람들이 있어서 정리해 보았다. 약간 귀찮더라도 코딩은 표준대로 쓰는 것이 향후의 이식성을 고려할 때 좋을 것 같다 = )
'IT Story > Programming Language' 카테고리의 다른 글
fwrite 와 fprintf 의 차이점 (8) | 2009.02.09 |
---|---|
goto Statement Consider Harmful (0) | 2008.12.01 |
비트 이동 연산자 ( << , >> ) 의 결과 (0) | 2008.10.24 |
C++ 과 C# 의 차이... (4) | 2008.07.13 |
프로그래밍 언어에서 음수의 나눗셈 처리 (12) | 2007.09.12 |