파일 두개가있음. main.c 와 fun.c 두개가있는데
fun.c 안에 int 함수이름(void)라는 함수가 있고
이 함수를 쓰려면 maic.c 맨위에 #include fun.c 해야하잔아?
근데 #include안하고 그냥 맨위에 int 함수이름(void)이거만딱 적어줬더니 작동되더라고
왜그런거임? 못찾아야하는거아닌가? 두 파일이 같은경로에 있고 비주얼스튜디오로했는데 그거랑 관련있나?
파일 두개가있음. main.c 와 fun.c 두개가있는데
fun.c 안에 int 함수이름(void)라는 함수가 있고
이 함수를 쓰려면 maic.c 맨위에 #include fun.c 해야하잔아?
근데 #include안하고 그냥 맨위에 int 함수이름(void)이거만딱 적어줬더니 작동되더라고
왜그런거임? 못찾아야하는거아닌가? 두 파일이 같은경로에 있고 비주얼스튜디오로했는데 그거랑 관련있나?
include랑 import랑 다름. 님이 한 건 외부 연결을 가지도록 함수를 선언한 것임. #include하는 것이 선언들이 있는 헤더 파일을 포함하는 것이니까 님이 한 거랑 링커 입장에서 같음. - λ
func.c파일안에 정의되어 있는 함수를 main.c파일안에 맨위에 프로토타입으로 int 함수이름(void) 이런식으로 써주기만해도
외부연결이 되서 같은 폴더에 있었을뿐인 그 파일안의 함수를 사용할수 있게 된거임? 외부연결이 뭐고 왜되는건가여?
그러니까 컴파일러가 func.c랑 main.c으로부터 func.o랑 main.o를 독립적으로 생성하는데, 님이 외부연결을 가지도록 한 선언은 "어딘가에 정의되어있겠지?"하면서 넘어감. - λ
이제 링커라는 녀석이 .o 파일들에 있는 외부 연결을 가지는 기호들을 연결해서 .exe 파일을 만듦. 근데 링커가 어떻게 작동하는지 내가 모름. - λ
명칭이 외부 연결, 내부 연결 또는 연결 없음을 가지도록 선언할 수 있는데 그냥 전역 선언 또는 extern 전역 선언은 명칭이 외부 연결을 가지도록 함. static 전역은 내부 연결. 함수 안에서 그냥 선언은 연결 없음. - λ
여기까지가 내 한계라서 미안함. 예전에 C 언어 책 한 권 읽은 게 전부라서. 딱 1년 전인데 다 까먹었네. - λ
ㄳㄳ!
개념이 어려운 건 아닌데 모든 설명을 간단하게 요약하는 게 어렵다
C 소스는 전처리 - 컴파일 - 링크 과정을 거쳐 프로그램이 됨. 소스 파일 하나가 전처리를 거치면 인클루드 되는 파일이 다 합쳐진 거대한 파일이 되고, 하나의 번역 단위 취급을 받음. 컴파일러는 번역 단위 하나씩만 받는데, 하나의 번역 단위 내에서 함수를 쓰려면 쓰려는 함수 선언이나 정의가 먼저 나와야만 사용할 수 있음. 근데 매번 함수 선언을 적는 게 비효율적이라 선언을 포함한 헤더 파일을 인클루드하는 방법을 쓰는 거임. 이런 번역 단위 여럿을 링크, 합쳐서 프로그램을 만듦. 이 때 각각의 함수 정의가 없거나 2개 이상이면 당연히 안 됨.
여기에 비추어 다른 소스파일의 함수를 쓰는 법은 1. a.c에 b.c에 있는 함수의 원형을 선언하고 a.c와 b.c를 각각 컴파일한 후 링커에 던진다. 2. a.c에서 b.c를 인클루드하고 a.c만 컴파일, 링커에 던진다. 2가지가 가능함. 인클루드 위치 문제같은 것도 있겠지만, 일단 대체적으로 맞는 설명임. 그냥 soen.kr C문법 6장 헤더 파일, 전처리기 쪽을 보는게 낫지 않을까도 생각.
감사합니다!
걍 VS 쓴다고 했으니 VS가 Exe파일 만들때 MSBuild란 프로그램을 뒤에서 쓰는데, 걔가 너 프로젝트파일을 읽어서 연결해주고 있음.
VS기능인거같음 ㄳ!
아니 VS기능이란 소리가 아니라-_- 저기 위에분들이 말씀하신 방식이 원래 컴파일러와 링커가 작동하는 방식인데.. 그걸 뒤에서 VS가 알아서 해주고 있다고. 걍 gcc 하나 깔고 컴파일 옵션 줘가면서 하나 만들어보면 바로 이해갈거..
아 글쿤여