| [ CnUnix ] in KIDS 글 쓴 이(By): Tony (관객2) 날 짜 (Date): 2002년 4월 7일 일요일 오후 01시 20분 35초 제 목(Title): Re: [Q] implementation과 call의 관계 ANSI C는 함수의 프로토타입을 선언해놓고 쓰는것을 "권장"하며 프로토타이핑을 해줄경우 타입체크를 해줍니다. 타입체크를 한다는 것은 에러를 낸다는 의미죠. 프로토타이핑을 안한 경우 리턴값은 int 아규먼트는 void로 가정합니다. 이건 컴파일러레벨에서 결정되는 일이구요. 그 후 링킹에대해선 관심을 가지지 않습니다. (C의 애매모호한 점들의 대부분은 바로 이 링킹은 어떻게하든 언어와는 무관하다는 태도에 있다고 봅니다만... 물론 이게 장점이기도 하죠^^) 링커는 아무 생각없이 심볼들을 연결해줍니다. 그러니까 obj파일을 어떻게 링킹해도 타입에러가 날수가 없죠... C++에서는 링킹타임에 타입에러를 찾기위해 함수의 심볼에 아규먼트의 타입을 포함시키는 방법을 사용합니다. 즉 void test(int,char,int) 이런 함수가 있다면 VtestICI 이런식으로 함수 이름을 바꿔버리면 링킹타임에 다른 아규먼트들을 가지는 함수와 링킹될 수 없으니까 항상 명확한 타입체킹을 하게되는 꼴이 되겠죠... K&R C에선 프로토타이핑을 하더라도 첫번째 아규먼트만 체크하거나 워닝만 내보내던걸로 기억되는데 이건 정확히 모르겠네요... 이구.. 좀 정리를 해보면 ANSI C는 타입체킹을 합니다. 컴파일러가!!! 컴파일러의 손을 떠나면(즉 다른 파일에 함수가 있으면) 타입체킹을 못합니다!!! 그걸막기위해 해더를 선언하고 타입을 적어주면 타입체킹을 합니다! == "너희는 이 곳, 이 세상을 어떻게 생각해?" "천국도 지옥도 갈 수 없는 '평범한 영혼'들이 잠시 들려 쓸쓸히 방황하는 곳이라고 생각합니다." |