C++에서는 메모리에 데이터를 여러 가지 방법으로 저장할 수 있다. 데이터를 메모리에 얼마나 오래 존속시킬 건지, 데이터 접근자에 대한 범위 설정이라던지 등을 선택할 수 있다.
일반적으로 C++는 프로그램을 구성하는 파일들을 분할하여 컴파일한 후에, 그걸 최종 실행 프로그램으로 링크할 수 있다. 만약 어떤 하나의 파일을 수정했다면, 그 부분만 다시 컴파일 하고, 이미 컴파일된 나머지 파일들과 링크하면 된다.
만약 어떤 구조체를 선언했는데, 그 구조체를 a, b파일 둘 다에서 사용하려면 어떻게 할까? 둘 다 선언하는 방법이 있을 것이다. 하지만 이것은 문제가 있다. 우선 타이핑 실수가 있을 수 있다. 사용할 파일이 2개뿐이라는 보장도 없고, 만약 변경해야 할 일이 생기면 일일이 다 변경해주어야 하는 단점이 있다.
이를 깔끔하게 처리하기 위해서 헤더파일을 사용한다. #include를 사용해서 구조체 선언이 적혀있는 파일을 포함시키면, 수정할 때도 편하고 실수도 적어진다. 다음은 구조체와 같이 헤더파일에 넣으면 좋을 목록들이다.
반면에 함수 정의나 변수 선언은 헤더 파일에 넣으면 안된다. 예를 들어 함수 정의를 헤더 파일에 넣고 나서, 하나의 프로그램을 구성하는 두 파일에 그 헤더 파일을 각각 넣으면 함수 정의가 두 개가 되어서 에러가 난다.
헤더 파일을 포함시킬 때 <>와 ""중 하나를 선택할 수 있다. <>를 사용하면 컴파일러는 표준 헤더 파일들이 들어있는 호스트 시스템의 파일 시스템 영역에서 그것을 찾는다. ""를 사용하면 먼저 현재 작업 디렉토리나 소스 코드 디렉토리에서 그것을 찾는다. 거기서 못 찾으면 표준 위치에서 찾는다. 그러니 개발자가 만든 헤더 파일은 ""를 사용해야 한다. 그래서 지금까지 써왔던 iostream은
#include <iostream>
이렇게 표기했다.
헤더 파일은 한 번만 포함시켜야 한다. 쉬울 것 같은가? 나도 그렇게 큰 프로그램을 다뤄보지 않아서 모르겠다. 근데 개발자들은 이런 실수를 많이 저질렀나보다. 이를 방지해주는 기법이 만들어진 걸 보면 말이다.
#ifndef COORDIN_H_ // if not defined 만약 정의되지 않았다면 실행해라.
#define COORDIN_H_ // 중복 방지를 위해 define 한다.
... // 포함시킬 include를 넣는다.
#endif
'COORDINH'이라는 이름이 전처리기 지시자 #define에 의해 정의되어 있지 않은 경우에만 #ifdef ~ #endif 사이에 있는 명령어들을 처리하라는 의미이다. 이름은 헤더파일과 비슷하지만 좀처럼 사용하지 않을 것 같이 밑줄(_)을 붙여줬다.