전처리기가 #include 지시자를 발견하면, 그 뒤를 따르는 파일 이름을 찾아 그 파일의 내용을 현재 파일에 포함시킨다.
소스코드 파일에 있는 #include 지시자는, 포함되는 파일에 있는 텍스트로 대체된다. 이것은, 사용자가 컴퓨터 앞에 앉아 포함되는 파일의 전체 내용을 소스파일의 특정 위치에 타이핑하는 것과 효과가 같다.
#include 지시자의 두가지 형태
#include <stdio.h> <- 파일 이름을 < >(꺾쇠 괄호)로 둘러 싼다.
#include "mystuff.h" <- 파일 이름을 " "로 둘러 싼다.
꺾쇠 괄호(< >)는 전처리기에게 하나 또는 그 이상의 표준 시스템 디렉토리에서 그 파일을 찾으라고 지시한다.
큰 따옴표(" ")는 현재 작업 디렉토리에서 그 파일을 찾으라고 지시한다. 파일이 없으면, 표준 시스템 디렉토리에서 찾는다.
ex)
#include <stdio.h> <-시스템 디렉토리들에서 찾는다.
#include "hot.h" <-현재 작업 디렉토리에서 찾는다.
#include "/usr/biff/p.h" <-/usr/biff 디렉토리에서 찾는다.
파일을 포함시키는 이유는 컴파일러가 요구하는 정보를 헤더파일이 가지고 있기 때문이다.
일반적으로 stdio.h 파일에는 EOF, NULL, getchar(), putchar()의 정의가 들어있다. getchar()와 putchar()는 매크로 함수로 정의되어 있다. 또한 C 입출력(I/O) 함수들의 프로토 타입이 들어있다.
확장자 .h 헤더파일(header file)에는 프로그램의 선두에 위치시켜야하는 정보를 가지고 있다. 헤더파일에는 대개 전처리기 문장들이 들어가 있으며, stdio.h와 같은 헤더파일들은 컴파일러에 내장되어 오지만, 사용자는 자신의 헤더파일을 자유롭게 만들 수 있다.
큰 헤더파일을 포함한다고 해서 프로그램의 크기가 커지는 것은 아니다. 헤더파일의 내용이 최종코드에 추가되는 것이 아니라 컴파일러가 최종코드를 만들기 위해 헤더파일 내에 있는 정보를 사용한다.
헤더파일의 사용
일반적으로 헤더파일의 내용은 다음과 같다.
- 명단상수(Manifest contant) : 전형적인 stdio.h 파일은 EOF, NULL, BUFSIZE(표준 입출력 버퍼의 크기)를 정의한다.
- 매크로 함수(Macro function) : 예를 들어, getchar()는 getc(stdin)으로 정의되어 있다. getc()는 다소 복잡한 매크로로 정의 되어 있다. ctype.h헤더는 ctype 계열 함수들의 매크로 정의들을 가지고 있다.
- 함수 선언(Function declaration) : string.h는, 문자열 계열 함수들의 함수 선언이 들어있다. 이 선언은 함수 프로토 타입 형식이다.
- 구조체 템플릿 정의(structure template definition) : 표준 입출력 함수들은 FILE을 가리키는 포인터를 전달인자로 사용한다. stdio.h는 일반적으로 FILE을, 구조체를 가리키는 포인터로 만들기 위해 #define 또는 typedef를 사용한다. 이와 비슷하게, size_t 형과 time_t형도 헤더파일들에 정의되어 있다.
'Programming > C' 카테고리의 다른 글
인라인 함수 와 _Noreturn 함수 (0) | 2019.07.17 |
---|---|
전처리기 지시자와 매크로 (0) | 2019.07.17 |
C #define에 전달인자 사용하기 (0) | 2019.07.10 |
C 전처리기와 C 라이브러리 (0) | 2019.07.10 |
C 비트 연산 - 정리 (0) | 2019.07.10 |