Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[3014] Re:Function 'test' should have a prototype.
심통 [cplusplus] 1273 읽음    2003-10-11 10:01
아무게 님이 쓰신 글 :
: #include <stdio.h>
:
: main()
: {
:    test();       
: }
:
: test()
: {
:    printf("Hello word");
: }
:
:
: Error:Function 'test' should have a prototype.
:
: 이런에러가 왜뜨는 거죠?
: 그리고 해결방법은 뭐죠?

C Compiler 는 warning 정도로 넘어가는데 C++ compiler 를 사용하시나요?
Compiler 가 source 를 compile 할때 1 pass 방식이니 2 pass 방식이니 하는게 있습니다.
간단히 말해 1 pass 는 전체 source 를 한번만 훑어보는 것이고 2 pass 는 전체 source 를 두번 훑어본다고 생각하시면 됩니다.
저도 대충 그렇게만 이해하고 있거든요.
1 pass 방식으로 생각하고 source를 순차적으로 훑어보면 main() 내부의 test() function 를 호출하는 시점에서 compiler 는 이 test() function 의 원형(prototype)이 어떤것인지 알 수가 없습니다. 다시말해 test() function 의 return type 이 뭔지 parameter 의 갯수나 각 parameter 의 data type 등의 정보를 알 수 없습니다.
그 뒤의 test() 정의 부분에 가서야 알 수 있거든요.
Compiler 가 main() 내부의 test() 호출에서 이 function 에 대한 prototype을 모르는 관계로 호출에 대한 처리를 하지 못해서 생기는 에러입니다.
이를 해결하려면 main() 이전에 test() 의 prototype 이라도 알려주던가
예를 들어

void test();

아니면 test() 정의 부분을 main() 이전에 해주시면 됩니다.

위의 소스를 2 Pass 로 처리한다면 Complier 가 처음 소스를 끝까지 한번 보는동안 test() 의 prototype 을 알 수 있기 때문에 두번째로 소스를 훑어보면서 test() 를 처리 할 수 있겠죠.
C compiler 가 1 Pass 로 처리하는 이유는 시간을 아낄려고 하는 것이겠죠. 아마두.


Turbo C compiler 를 쓰시다보면 Link 시에 2 Pass 라고 하는게 잠깐 지나 갑니다.
위 이야기는 Compile 에 관한 거구 Link 는 2 Pass 를 하는 것 같습니다.


+ -

관련 글 리스트
3013 Function 'test' should have a prototype. 아무게 1139 2003/10/11
3014     Re:Function 'test' should have a prototype. 심통 1273 2003/10/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.