8. 메모리 모델과 이름 공간(1) - 분할 컴파일

WanJu Kim·2022년 10월 26일
0

C++

목록 보기
35/81

C++에서는 메모리에 데이터를 여러 가지 방법으로 저장할 수 있다. 데이터를 메모리에 얼마나 오래 존속시킬 건지, 데이터 접근자에 대한 범위 설정이라던지 등을 선택할 수 있다.

일반적으로 C++는 프로그램을 구성하는 파일들을 분할하여 컴파일한 후에, 그걸 최종 실행 프로그램으로 링크할 수 있다. 만약 어떤 하나의 파일을 수정했다면, 그 부분만 다시 컴파일 하고, 이미 컴파일된 나머지 파일들과 링크하면 된다.

만약 어떤 구조체를 선언했는데, 그 구조체를 a, b파일 둘 다에서 사용하려면 어떻게 할까? 둘 다 선언하는 방법이 있을 것이다. 하지만 이것은 문제가 있다. 우선 타이핑 실수가 있을 수 있다. 사용할 파일이 2개뿐이라는 보장도 없고, 만약 변경해야 할 일이 생기면 일일이 다 변경해주어야 하는 단점이 있다.

이를 깔끔하게 처리하기 위해서 헤더파일을 사용한다. #include를 사용해서 구조체 선언이 적혀있는 파일을 포함시키면, 수정할 때도 편하고 실수도 적어진다. 다음은 구조체와 같이 헤더파일에 넣으면 좋을 목록들이다.

  • 함수 원형
  • #define이나 const를 사용하여 정의하는 기호 상수
  • 구조체 선언
  • 클래스 선언
  • 템플릿 선언
  • 인라인 함수

반면에 함수 정의나 변수 선언은 헤더 파일에 넣으면 안된다. 예를 들어 함수 정의를 헤더 파일에 넣고 나서, 하나의 프로그램을 구성하는 두 파일에 그 헤더 파일을 각각 넣으면 함수 정의가 두 개가 되어서 에러가 난다.

헤더 파일을 포함시킬 때 <>와 ""중 하나를 선택할 수 있다. <>를 사용하면 컴파일러는 표준 헤더 파일들이 들어있는 호스트 시스템의 파일 시스템 영역에서 그것을 찾는다. ""를 사용하면 먼저 현재 작업 디렉토리나 소스 코드 디렉토리에서 그것을 찾는다. 거기서 못 찾으면 표준 위치에서 찾는다. 그러니 개발자가 만든 헤더 파일은 ""를 사용해야 한다. 그래서 지금까지 써왔던 iostream은

#include <iostream>

이렇게 표기했다.

헤더 파일은 한 번만 포함시켜야 한다. 쉬울 것 같은가? 나도 그렇게 큰 프로그램을 다뤄보지 않아서 모르겠다. 근데 개발자들은 이런 실수를 많이 저질렀나보다. 이를 방지해주는 기법이 만들어진 걸 보면 말이다.

#ifndef COORDIN_H_	// if not defined 만약 정의되지 않았다면 실행해라.
#define COORDIN_H_	// 중복 방지를 위해 define 한다.
...					// 포함시킬 include를 넣는다.
#endif

'COORDINH'이라는 이름이 전처리기 지시자 #define에 의해 정의되어 있지 않은 경우에만 #ifdef ~ #endif 사이에 있는 명령어들을 처리하라는 의미이다. 이름은 헤더파일과 비슷하지만 좀처럼 사용하지 않을 것 같이 밑줄(_)을 붙여줬다.

profile
Question, Think, Select

0개의 댓글