본문 바로가기

Embedded Programming/C/C++

다수의 파일로 나누어 작업하기(header file 만들기)

#include <stdio.h>


void AA(float);

int main()
{
  AA(3.14f);
  
  return 0;
}

void AA(float fNum)
{
  printf("fNum : %f\n", fNum);
}

위의 코드를 함수 별로 나누어 저장하면


main()함수와 AA()함수를 각각의 .c파일에 따로 저장하고

이를 공통으로 include 해주는 헤더파일 .h를 만들어주면 된다.

그리고 헤더파일에는 함수의 정의부분을 선언해주면 된다.



이렇게 나누어진 파일은 cl /c @@@.c 형태로 분할 컴파일 해준 후

cl ***.obj ###.obj 형식으로 링크해주면 하나의 실행파일을 만들 수 있다.




위에서 cl /c 파일명.c 형태의 분할 컴파일은 아래 그림의 ①②③단계에 해당한다.

전처리 과정에서 헤더를 포함시키고 그것을 어셈블리어로 번역한 후, 기계어로 번역된 

오브젝트 파일(.obj)을 생성하는 것이다.

이후 생성된 오브젝트 파일은 <cl 파일명1.obj 파일명2.obj> 의 형태로 .obj파일을 하나로 묶어 

실행파일인 .exe파일을 생성한다.(위 그림 ④번 과정)



이 과정이 귀찮거나 모든 파일을 한 폴더에 갖고 있는 경우라면

cl *.c로 한방에 해결할 수도 있다.(위 그림 ①②③④과정을 한번에 처리)

※ 다른 .c파일이 섞여있는 경우는 실행파일 생성 안 됨!



이렇게 .obj파일 생성 후(컴파일) 생성된 main.exe실행파일의 실행순서는 다음과 같다


① 먼저 main.c의 코드부터 실행된다. 함수 호출부를 만나면 main.c내부에서 찾고 

없을 시 include 된 헤더파일에서 검색하게 된다.

② main.c에서 호출한 함수의 정의부를 smart.h에서 찾는다.

③ smart.c에서 구현되어있는 AA()함수를 실행한다.


헤더파일과 소스파일의 관계를 정리해보면 다음과 같다.




마치 헤더파일은 소스파일간을 이어주는 오작교(?)같은 징검다리 역할을 한다는 것이다.

main.c와 smart.c를 견우와 직녀, smart.h를 까막까치라 생각하면 쉽지 않을까 싶다. ㅎㅎ


하지만 정확한 그림을 그리자면, 

컴파일의 4단계에서 전처리 과정을 거치면 헤더파일이 소스위에 포함되어 

어셈블리어로 번역되므로 아래 그림과 같다고 하겠다.



마지막으로 컴파일의 4단계에 대해 잘 모르시는 분들을 위해 ppt를 첨부합니다.

전처리 단계 후 헤더파일이 코드에 포함되는것을 확인하고 싶은 분들은 ppt를 보고 한번 

따라해보시길 바랍니다.

컴파일 4단계.pptx