2.2 헤더 파일 만들기
헤더 파일에 포함되는 내용은 다음과 같다
- 외부에 공개할 매크로의 정의(함수형 매크로)
- 외부에 공개할 상수의 정의(
#define
, enum
등의 정의)
- 외부에 공개할 구조체, 공용체의 정의
- 외부에 공개할 자료형의 정의 (
typedef
를 이용한 자료형의 정의)
- 외부에 공개할 함수의 원형 선언
- 외부에 공개할 전역 변수의
extern
선언
- 이 라이브러리를 이용할 때 필요한 다른 헤더 파일의 인클루드문(예를 들어 함수의 인자나 반환값으로
FILE *
형을 이용한다면 stdio.h를 인클루드해야 한다.)
2.2.1 매크로 정의
보통 매크로 함수는 일반적인 함수와 구분해주기 위해 이름을 모두 대문자로 기술하는 것이 관례이다. 꼭 외부에 공개할 필요가 있는 매크로만을 헤더 파일에 기술한다.
매크로가 중복 정의된 경우 gcc는 다음과 같이 처리한다.
- 두 정의가 같은 내용인 경우, 에러를 발생하지 않고 통과한다.
- 두 정의가 서로 다른 경우, 컴파일 시에 “redefined”를 알리는 경고가 발생하고, 나중에 정의된 값을 취한다.
매크로 이름의 충돌을 확실히 방지하고 싶다면 아래와 같이 경고를 발생시키는 편이 낫다.
#ifndef MAX
#define MAX(x, y) ((x) > (y) ? (x) : (y))
#else
#warning Duplicated definition of MAX
#endif
2.2.2 상수 정의
2.2.3 구조체, 공용체 정의
헤더 파일에서 구조체를 정의하는 경우, “이 구조체는 라이브러리의 사용자가 멤버 변수를 자유롭게 조작해도 무방하다.”는 의사를 암시적으로 포함하는 셈이 되므로 이에 유의해야 한다.
2.2.4 자료형 정의
2.2.5 함수의 원형 선언
함수 원형은 반드시 명시적으로 선언하고, 컴파일시에 -Wall
옵션을 주어 관련 경고를 모두 출력하도록 하자.
2.2.6 전역 변수의 extern 선언
2.2.7 다른 라이브러리 헤더 파일의 인클루드
원칙적으로는, 라이브러리를 컴파일할 때에만 필요한 경우라면, .c에, 라이브러리를 이용할 때 필요한 경우라면 .h에 인클루드하는 것으로 정해두면 된다.
2.2.8 다중 인클루드 문제
인클루드의 중첩은 다중 인클루드를 유발한다. 다중 인클루드가 발생하면 같은 단어에 대해 #define
의 정의나 typedef
의 정의가 여러 번 등장하게 된다.
#define
의 재정의
- 같은 단어에 대해 같은 정의를 내리는 경우, 오류나 경고로 처리하지 않는다.
- 같은 단어에 대해 다른 정의를 내리는 경우, 경고를 출력하고, 나중에 정의된 뜻을 따른다.
typedef
의 재정의
- 같은 자료형에 대해 중복된 정의를 내리면 무조건 에러로 처리한다.
이러한 문제들을 회피하기 위해, #ifndef
와 #endif
로 묶어서 같은 헤더 파일 본문이 여러 번 반복되지 않도록 해둔다.
#ifndef _STRING_H_INCLUDED_
#define _STRING_H_INCLUDED_
#endif