컴퓨터공부/C & C++ & STL

Cfaq 12

achivenKakao 2009. 4. 15. 01:39
그렇다.. "void main()"은 틀린 표현이다.

"int main"이 표준이다.

+

Q 11.12a main()의 정확한 선언 방법을 알고 싶습니다.
Answer main()의 선언은 다음 중에서 골라 써야 합니다:
int main(void);
int main(int argc, char *argv[]);
argv를, char **argv로 선언할 수도 있습니다. (질문 6.4를 참고하기 바
랍니다.) (물론 이때 ‘argv’와 ‘argc’라는 이름은 얼마든지 바꿀 수 있습니
다.) 또 오래된 스타일을 써서 다음과 같이 할 수도 있습니다:
int main()
int main(argc, argv)
int argc;
char **argv;
질문 11.12b부터 11.15까지 참고하기 바랍니다.

Q 11.14 main()을 void 타입으로 선언한다 하더라도, exit() 함수를 써서 종료한
다면 문제될 게 전혀 없지 않나요? 게다가 제가 쓰고 있는 운영 체제는 프
로그램의 종료/리턴 코드를 아예 무시한답니다.
Answer main()의 리턴 값이 쓰이냐, 쓰이지 않느냐는 중요한 문제가 아닙니다; 문
제는 main()을 void 타입으로 선언함으로 인하여, main()을 호출하는 부
분이 (런-타임 시작(startup) 코드) main()을 제대로 호출하지 못할 수 있
다는 것입니다 (이는 calling convension 문제입니다; 질문 11.12b를 참고
하기 바랍니다).
Borland C++ 4.5에서 void main()을 썼을 때, 프로그램이 망가질 수 있
다는 것이 이미 보고되었습니다. 그리고 어떤 컴파일러들은 (DEC C V4.1
과 gcc) main을 void 타입으로 선언했을 때, 경고를 발생합니다.
여러분의 운영 체제가 종료 상태(exit status)를 무시할 수도 있고, void
main()이 동작할 수도 있지만, 이는 이식성이 없을 뿐만 아니라, 올바른
것도 아닙니다.
여러 시스템에서 void main()으로 써도 동작한다는 것은 사실입니다. 만약
이식성을 전혀 고려할 생각이 없고, 이 방식이 더 편하다고 생각하면, 아무
도 말릴 사람은 없습니다.
Note C 표준은, 질문 11.12a에 나온 꼴의 main 함수를 지원할 것을, 컴파일러
에게 요구합니다. 또한 컴파일러는 C 표준에 나와 있지 않는 형태의 main
을 제공하는 것에는 관여하지 않습니다. 그러나, 다른 비표준 형태를 쓰는
것은 (표준 관점에서 봤을 때) ‘undefined behavior’를 낳습니다.