헤더 파일이란

Ji_min·2022년 7월 7일
0

최근 C++를 공부하면서 헤더 파일과 cpp 파일이 분리된다는 것을 알게 되어서, 관련 개념을 정리해보았다.


정의

  • C++에서 어떤 기능을 사용하기 위해서는 일반적으로 그 기능을 선언(declaration)하고 정의(definition)하는 두 부분이 필요하다.
  • 이 때, 선언하는 부분과 정의(구현)하는 부분에 대한 내용을 각자 다른 파일에 분리해서 관리한다.
  • 선언부는 .h 혹은 .hpp로 끝나는 헤더 파일에 담기고, 구현부는 .cpp 혹은 .cc로 끝나는 파일에 담긴다.
  • cpp 파일에서는 헤더 파일을 포함(include)한다는 선언을 통해 헤더 파일에 선언된 기능을 사용한다.
    • ex) #include <iostream>

헤더 파일과 cpp 파일을 분리하는 이유

C++ 프로젝트의 컴파일 과정과 연관된다.

이미지 출처

  • 위 이미지처럼 컴파일 시 각 cpp 파일은 독립적으로 컴파일된다.
    • 예를 들어, a.cpp 파일에서 선언된 A라는 클래스를 b.cpp 파일에서 사용하기 위해서는 b.cpp 파일에도 클래스 A가 선언되어 있어야 한다.
  • 따라서 동일한 내용이 복수의 파일에 분산되어 존재하게 된다.
  • 이럴 경우 링커가 컴파일 단위를 하나의 실행 파일로 병합하려고 할 때, 내용 간의 불일치로 인해 오류 또는 의도치 않은 동작이 발생할 가능성이 있다.
  • 그래서 이러한 오류 가능성을 최소화하기 위해 헤더 파일을 분리해서 따로 관리한다.

동작 방식

  • 헤더 파일을 cpp 파일에 포함시키는 방법 → #include + 헤더 파일명
    • 외부 라이브러리의 경우 - #include <name>
    • 사용자가 만든 파일의 경우 - #include "path"
    • external → local의 순서로 가져오는 방식이 권장된다.
  • 전처리기가 지시된 헤더 파일을 찾아 내용의 복사본을 cpp 파일에 직접 삽입한다. (copy & paste)
  • 이 때, 동일한 헤더 파일이 중복되어 삽입되면 모듈이 재정의되는 문제가 발생한다.
    • 헤더 파일의 상단에 #pragma once 를 넣어 이를 방지한다.
    • 혹은 아래와 같이 #ifndef를 사용해 중복을 방지한다.
        #ifndef _TEST_HEADER1__
        #define _TEST_HEADER1__
           ...code...
        #endif

참고

profile
Curious Libertine

0개의 댓글