아무게 님이 쓰신 글 :
: #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 를 하는 것 같습니다.
|