#include ~ 는 간단히 말해서 복사, 붙여넣기이다.

컴파일러가 include 된 헤더파일을 찾아서 해당 위치에 가져다가 복사하는 것이다.

 

여러 곳에서 같은 헤더파일을 가져다가 사용할 수 있는데,

그냥 헤더파일만 가져다가 넣어버리면 소스코드별로 클래스나 변수 등등이 중복 정의가 되기 마련이다.

그래서 #ifndef #define #endif 를 통해 다른 곳에서 include 될 때 중복 정의 하지 않고 무시하도록 선언해준다.

최근 gcc 컴파일러에서는 #pragma once 하나만으로 대체하는 기능이 생겼지만, 컴파일러마다 다르다는 것은 주의하도록 하자

 

#include 는 가급적이면 헤더파일이 아닌 cpp 파일에다가 넣어주도록 하자

헤더파일에 넣어도 컴파일 되고 돌아가지만 헤더파일들에 include 들을 해주게 되면,

다른 곳에서 여러 헤더파일들을 가져올 때 필요 없는 헤더파일들이 엄청나게 몰리게 되는 현상이 발생하게 된다.

 

하지만 헤더파일에서도 함수 리턴이나, 매개변수들에 타입을 지정해주기 위해 include 해주어야 할 경우도 있다.

이런 경우에는 cpp 파일이 아닌 헤더파일에 해주도록 하자.

 

왜 귀찮게 헤더파일과 cpp 파일로 나누어 놓았을까?

선언 declaration 과 정의 definition 를 나눠놓기 위해서이다.

컴파일을 할 때 헤더파일을 붙여넣고 오브젝트를 만들어내는데, 이 때 클래스 간에 완전히 분리가 되는 것이다.

a를 사용하는 b 클래스는 a의 기능에 대해서는 비워두고 오브젝트로 만들어지는데, 이후 링킹 과정을 통해 기능들이 연결되는 것이다.

 

결국 독립적으로 컴파일을 하기 위해서!

각각의 cpp 파일들은 컴파일 돼서 바이너리 파일로 만들어진다

각 오브젝트 파일들에는 다른 객체의 함수 선언부분만 들어가 있고, 실제로 어떻게 작동하는지는 들어가있지 않다.

이 비어진 부분을 후에 링커가 연결시켜주면서다 결국 하나의 파일이 만들어진다!

'STUDY > C++' 카테고리의 다른 글

[C++] 키워드 static  (0) 2020.05.26
[C++] list 를 쓸까?  (0) 2020.05.22
[C++] 배열과 벡터?  (0) 2020.05.21
[C++] 벡터 push() vs emplace()  (0) 2020.05.10
[C++] vector : push_back() 의 시간복잡도는?  (1) 2020.05.10

+ Recent posts