프로그램을 파일로 나누면 선언과 정의의 위치가 계약이 된다. 헤더는 선언을 여러 번역 단위에 보여주고, 소스 파일은 정의를 한 번 제공한다.
포함 가드
#pragma once
namespace janggy {
struct Pos { int file; int rank; };
int clamp(int v, int lo, int hi);
}`#pragma once`나 include 가드는 같은 헤더가 한 번역 단위에서 두 번 펼쳐지는 일을 막는다. 함수 본문을 헤더에 두려면 `inline`을 붙이거나, 클래스 안에서 정의해 암시적 인라인이 되게 한다. 템플릿은 예외적으로 헤더에 둔다.
이름 충돌
`std`와 프로젝트 이름은 네임스페이스로 나눈다. 헤더에서 `using namespace std;`를 쓰면 그 헤더를 포함하는 모든 파일이 이름 오염을 물려받는다. 소스 파일 안의 짧은 범위에서는 타협할 수 있어도, 헤더에서는 금지에 가깝다.
선언만 보고 호출할 수 있어도, 링커가 정의를 찾지 못하면 빌드는 실패한다. 오류의 이름이 어느 네임스페이스의 어느 시그니처인지 읽으면, 빼먹은 소스 파일을 찾기 쉽다.
댓글
0개아직 댓글이 없습니다.