얼마전까지 Java를 공부하다가 C++로 전향 하게 되었습니다. 책을 읽다가 함수 원형에 대해서 설명 부분을 읽게 되면서 의문점이 생기게 됐습니다. Java와 달리 C++ 에서는 main() 위에 함수 원형을 선언후 다른곳에서 함수를 정의 하여 사용하거나 혹은 main() 함수 위에 함수를 정의하여 사용하는 방법 이 두가지 방법이 있더군요
제가 궁금한것은 함수원형이 컴파일러에게 함수의 전달 인자의 취하는지 여부와 원형의 근거하여 오류를 검출한다는 것인데 어째서 함수 자체를 이용하여 함수의 전달인자를 취하는지 여부와 오류 검출 방법을 사용하지 않는 점이 굼금하네요. 속도의 차이라던가 그런건가요?
함수 원형 사용에 대해 이해를 잘못하겠어요 @.@
위에서 얘기했듯, 한번에 소스를 훑어 내려가며 컴파일링을 하기 때문에, 사전에 등장하지 않은 심볼(변수 혹은 함수등)에 대해서는 어떤 녀석인지 컴파일러가 알 수 있는 방법이 없습니다. 예를들어 사전 정의 없이 a() 라는 함수를 호출하게 되면 컴파일러는 대충 int a(void) 형태로 가정하고 함수를 호출하게 됩니다. 그런데 뒤에가서 void a(int b) 머 이런식으로 함수의 정의를 만나게 되면 컴파일러가 가정한 타입과 틀리게 되기 때문에 컴파일 에러가 발생하기도 하지요.
주절주절 말이 길어지긴 했는데, 함수의 원형이라는 것은 컴파일러에게 이런이런 함수를 만나거든, 이건 리턴타입은 뭐고, 파라메터로는 이것 저것을 받아들이는 녀석으로 봐라라고 알려주는 역할을 한다고 보시면 됩니다. 자바의 경우 2PASS 이므로 미리 한번 스캔을 하여 각 함수(메소드)의 원형을 파악하고 심볼테이블을 작성해두므로 별 문제가 없지만, C/C++의 경우에는 1PASS라서 원형을 선언해 주지 않으면 적절한 타입체크 혹은 컴파일 에러등을 피할 수 없게되는 것입니다.
음.. ㅡ.ㅡ;; 제가 봐도 뭔 말인지 모르겠지만 적은게 아까우니 걍 포스트 ;;;