C 언어 | 전처리(preprocess) | 포함 - #include

컴파일 전에 처리되는 #include 전처리기 지시문(Preprocessor Directives)을 사용하여 선언 등을 정리한 헤더 파일을 모든 소스 파일에 포함시킬 수 있다. 이를 포함(include)라고 한다.

헤더(header) 파일 만들기

여러 파일로 구성된 중간 규모 이상의 개발 프로젝트는 프로그램 방법뿐만 아니라 파일의 구성도 중요해지고 있다. 여기서 다루고 있는 작은 테스트용 프로그램이라면 하나의 파일로 충분히 만들 수 있지만 실전은 그렇지 않다. 개발 멤버는 혼자가 아니며, 어떤 그룹은 그래픽, 다른 그룹에서는 음성 등 다른 분야의 개발을 동시 진행으로 할 가능성이 충분히 있다. 그리고 이는 하나의 파일로 할 수 없다.

논리적으로 구분된 기능을 파일마다 분할하여 개발을 진행하는 경우는 마지막으로 소집하여 컴파일할 필요가 있다. 일반적으로 main() 함수를 포함하는 실행 파일을 작성하기 위한 소스 파일의 확장자를 *.c로하지만, 그 이외의 라이브러리의 역할과 기능 세트를 제공하는 파일은 헤더 파일로 *. h를 확장자로 하는 관행이 있다. 헤더 파일은 main() 함수 앞에 삽입된다.

여러 파일을 하나로 정리하여 컴파일하려면, #include 전처리기 지시문을 사용하여 파일의 지정된 위치에 헤더 파일을 삽입하도록 컴파일러에 전달된다. 컴파일러는 #include를 발견하면 이 위치에 지정한 파일을 삽입한다. 지금까지는 #include <stdio.h>와 같이 작성하여 C 언어를 기본으로 지원하는 라이브러리 파일을 결합해 왔다. 이를 포함하도록 표현한다.

표준 파일 이외의 포함에 #include "파일 이름"과 같이 큰 따옴표로 묶어 작성한다. 이것은 “처음하는 C 언어“에서 설명하였다. 컴파일러가 어떻게 파일을 검색하거나 컴파일러 문서를 참조한다. 큰 따옴표로 묶여있는 경우는 보통 *.c 파일과 같은 디렉터리에서 검색된다.

포함은 단순히 파일의 삽입하는 것으로 생각할 수 있다. 이 #으로 시작하는 명령은 컴파일러가 아닌 전처리에 대한 명령이다. 전처리는 소스가 컴파일되기 전에 실행된다. #include 파일을 삽입하는 명령이므로, 컴파일러가 소스를 컴파일하기 전에 지정된 위치에 파일의 내용을 그대로 삽입하는 것이다. 따라서 개발자는 헤더 파일에 일반 함수 등을 작성하고, 이를 프로젝트의 C 소스 파일에 포함하는 것이다. 그러면 같은 함수를 여러번 작성하는 작업에서 해방된다.

코드1

/* sample.h */
int strlen(const char *str);

코드2

int strlen(const char *str) {
  int count;
  for(count = 0 ; *(str + count) ; count++);
  return count;
}

코드3

#include <stdio.h>
#include "sample.h"

int main() {
 char *str = "Kitty on your lap";
  printf("%s length=%d\n" , str , strlen(str));
  return 0;
}

헤더 파일의 코드1을 작성하고 이를 코드3에 포함하여 컴파일한다. 그러면 #include "sample.h"라고 작성한 위치에 헤더 파일의 내용이 그대로 복사되고 컴파일된다. 코드1에는 NULL 문자를 제외한 문자열의 문자 수를 반환 strlen() 함수를 선언한다. strlen() 함수의 구현은 코드2에서 작성하고 있다. 이러한 헤더 파일을 한번 만들면 모든 개발 프로젝트에서 재사용할 수 있다.




최종 수정 : 2017-11-26