RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
IRC채널에 올라온 글을 읽던 도중 후배가 int main()와 void main()의 차이점을 물어보았다.

2학년때 C스터디를 진행할 때 이것땜에 곤란을 겪었던 적이 한번 있었는데, 그때는 설렁 설렁 넘어갔던 기억이 있다.

고급계산이론 과제를 하던 도중에 한번 쉬엄쉬엄 찾아볼까 해서 구글링을 해봤는데 알아낸 사실은 다음과 같다.

1. C99 이후의 표준 main 함수는 다음과 같아야 한다.
int main() 이거나
int main(int argc, char *argv[])

2. void main()에 비해서 int main()이 좋은 점은 종료 후 invoker(호출자)에게 해당 값을 넘겨준다. 이는 exit(); 함수와 같은 역할인듯 하다.

3. 다음과 같은 방법으로 바로 직전에 실행 되었던 프로그램이 반환한 값을 알 수 가 있었고, 실제로 넘겨준다는 것을 알 수 있었다.

다음과 같은 소스 코드를 작성한다.
#include <cstdio>

int main() {
        return 1;
}
컴파일 후 다음과 같이 해본다.
[libe@aslab libe]$ ./a.out
[libe@aslab libe]$ echo $?
1

근데 이것은 linux상에서 확인한 결과이고, 실제로 windows상에서는 어떤 방식으로 확인을 할 수 있을지 궁금하다(아시는 분께서 답변을 해주시면 감사하겠습니다.). 요사이 관심사 중에 하나가 run-time error 체킹을 쉽게 하는 방법에는 무엇이 있을까? 였는데, linux상에서 테스트 해본 결과 assert를 이용한 run-time error의 경우 138, segmentation fault의 경우 139라는 값을 확인 할 수 있었다. 생각 했던 것 보다 쉽다 ~_~

첨가 - windows의 경우
구글링을 해본 결과 Windows에서도 다음과 같은 batch file을 생성하면 확인을 할 수 있다.
@echo off
실행파일명
@if "%ERRORLEVEL%" == "0" goto good

:fail
echo Execution Failed
echo return value = %ERRORLEVEL%
goto end

:good
echo Execution Succeded
echo return value = %ERRORLEVEL%
goto end

:end
하지만 linux와 다른점은 assert()의 경우엔 얌전히 동작하는데, scanf("%d",a); 와 같은 코드에서 오류창을 띄운다음에 아마 메모리 주소로 추정되는 값을 내뱉는다-_-; 조금더 연구해봐야할 필요가 있을듯 싶다.

그런데 exit를 쓰면 void main()도 마찬가지의 기능을 할 수 있을텐데(테스트 결과도 마찬가지 였다.)  int main()의 좋은점이라고 하면 cstdlib헤더를 첨가 하지 않아도 된다는 점이라고 해야하나?

2007/07/10 18:01 2007/07/10 18:01
이 글에는 트랙백을 보낼 수 없습니다
지나가던길  | 2014/09/18 11:36
고맙습니다. 많은 참고가 되었습니다.
웅쓰:웅자의 상상플러스
웅자의 상상플러스
전체 (379)
게임 (5)
영화 (2)
기타 (23)
맛집 (5)
영어 (2)
대수학 (3)
형태소 (5)
Hacking (9)
Linux (112)
HTML (48)
Application_developing (48)
Web_developing (102)
Window (11)
«   2018/02   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28      
  1. 2016/01 (1)
  2. 2015/12 (3)
  3. 2015/10 (3)
  4. 2015/03 (2)
  5. 2015/01 (4)