.h파일과 .cpp파일을 구분하는 이유가 있나요?


왜 C++에서는 헤더 파일이랑 .cpp파일을 따로 쓰나요?

  • 2016년 01월 15일에 작성됨

조회수 599


1 답변


좋아요
0
싫어요
채택취소하기

C++ 컴파일 과정

C++을 컴파일하는 과정은 크게 2가지로 나눌 수 있습니다.

첫 번째는 source text 파일을 binary object 파일(.OBJ/.O)로 컴파일하는 것이고, 두 번째는 모든 object파일을 link해 실행 가능한 binary파일을 만드는 것입니다.

첫 번째 과정에서는

  • 헤더 파일을 include하지 않은 경우: CPP파일만 컴파일합니다.
  • 헤더 파일을 include한 경우는 관련: CPP파일이나 library가 같이 컴파일됩니다.

CPP파일들은 서로서로 독립적으로 컴파일됩니다.

그래서 다음과 같이 A.CPP에 B.CPP파일에서 정의한 symbol을 쓰면 A.CPP는 B.CPP파일에 해당 symbol이 있는지 알 수 없으므로 컴파일되지 않습니다.

// A.CPP
void fncA()
{
   fncInB(); // B.CPP에 정의된 함수
}

/**************파일구분****************/

// B.CPP
void fncInB()
{
   // 어떤 코드
}

이 문제를 해결하려면 A.CPP에 해당 symbol을 선언해 줘야 합니다.

// A.CPP
void fncInB() ; // B.CPP의 fncInB()선언

/**************파일구분****************/

void fncA()
{
   fncInB() ; // B.CPP에 정의되어 있음
}

C.CPP에서도 fncInB()를 쓰려면 어떻게 해야 할까요? 이 역시 마찬가지로 C.CPP에 fncInB()를 선언해주면 됩니다.

CPP파일이 아주 많은 경우엔?

서로 다른 10개의 CPP파일이 모두 fncInB()를 쓴다고 하면 10개의 CPP파일에 한 번씩 총 10번 선언해야 할까요? fncInB1(), fncInB2(), fncInB3(), ... 같이 함수가 더 많아지면 어떻게 해야 할까요?

이런 코드는 유지/보수하기 힘들기 때문에 헤더 파일안에 fncInB1(), fncInB2(), fncInB3()를 한 번씩 선언한 뒤 각 CPP파일에서 헤더 파일을 include하는 방식을 씁니다.

컴파일러가 include를 처리할 때 해당 파일의 내용이 그 위치에 대신 들어가기 때문에 프로그래머가 직접 복사-붙여넣기 하지 않고 컴파일러에게 그 일을 대신시키는 것이지요.

// B.HPP - 헤더파일
void fncInB() ; //함수를 선언

/**************파일구분****************/

// A.CPP
#include "B.HPP"

void fncA()
{
   fncInB() ; // B.CPP에 정의된 함수
}

/**************파일구분****************/

// B.CPP
#include "B.HPP"

void fncInB()
{
   // 어떤 코드
}

/**************파일구분****************/

// C.CPP
#include "B.HPP"

void fncC()
{
   fncInB() ; // B.CPP에 정의된 함수
}
  • 2016년 01월 15일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close