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

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

1답변

  • 좋아요

    1

    싫어요
    채택취소하기

    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에 정의된 함수
    }
    

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.