c++ 빌드를 위해서 일반적으로 Header, cpp 파일로 나누는데, 그 이유는 무엇이고,
헤더 파일은 어떻게 사용하면 될까?
예제1: 잘못된 함수 호출
foo() 함수를 main() 아래로 내리면, main 함수는 foo()가 어디 있는지 알 수 없기 때문에 호출하지 못한다.
이 때 void foo()를 main 함수 위에 선언해주고 컴파일 해주면 해결된다.
위 부분을 선언 declaration 이라 하고, -즉 함수가 있음을 알려주고
아래 부분을 정의 definition/implementation 이라고 한다, -함수의 실제 내용을 채워주는 것이다.
만약 이처럼 foo()함수를 선언해준 다음 정의해주지 않는다면 linking error가 된다.
그림으로 보면,
main.cpp 파일은 있고 컴파일에 성공해서 main.o (object file) 은 만들어졌다.
오브젝트 파일에서 실행 파일 exe를 만들려고 하는데 foo() 함수를 호출할 수 없기 때문에 (뭔지모름)
링킹 과정이 실패한 것이다.
foo()함수를 어디서 찾을 수 있을까?
foo.o 오브젝트 파일이 있다면 찾을 수 있다. 그렇다면 foo.o를 만들기 위해서 foo.cpp 파일이 필요하게 된다.
이렇게 되었을 경우에,
main.cpp 파일과 foo.cpp 파일 둘 모두에서 void foo();를 선언해줄 필요는 없다. -중복-
이 부분을 .h 헤더 파일에 옮겨주면 모든 declaration 선언 파트를 헤더파일 하나로 관리가 가능하다.
foo.h파일을 만들어서 foo() 선언 부분을 옮겨주자.
헤더파일에 있는 선언 부분을 cpp 파일에서 #include 로 불러주자.
이렇게 되면 아무런 문제 없이 컴파일이 되고 프로그램이 실행된다.
그림으로 보면, foo.h 파일이 만들어져서 #include를 통해서 foo.h 파일의 내용이 복사 붙여넣기가 되어서 하나의 translation unit으로 만들어 주고 compilation 과 link 과정이 진행이 되는 것이다.
Class의 경우
class의 경우에도 동일하게 진행된다.
cat 클래스를 만들어 준 후에,
cat.h 파일과 cat.cpp 파일을 만들어주고
main.cpp 의 cat.h 를 #include 를 통해 가져와서 kitty라는 object를 만들고 사용할 수 있다.
이를 응용해서 Zoo.cpp 파일에서 고양이 object가 필요하다면 #include를 통해 preprocessor가 cat.h를 가져오게 되고,
compiler는 zoo.cpp파일만 컴파일해서 zoo.o 오브젝트 파일을 만들 수 있다.
dog.h 처럼 강아지를 가져와서 zoo.cpp 에서 독립적인 빌드 프로세스도 만들 수 있게 된다.
위와 같이 c++ 는 object oriented programming languate 즉 객체가 중심이 되는 언어이다.
정리
1. object의 선언 declaration 파트는 .h 헤더 파일에 넣어준다.
2. 정의 definition 파트는 .cpp 파일에 넣어준다.
'모던C++ > 컴파일 프로세스 Compile Process' 카테고리의 다른 글
4. Static Library (0) | 2022.07.13 |
---|---|
3. extern, static (0) | 2022.07.12 |
2. PreProcessor 프리프로세서 - 전처리기 (0) | 2022.07.12 |
0. C++ 빌드 프로세스, 컴파일 프로세스 (0) | 2022.07.11 |