C 헤더 파일
헤더 파일은 확장자가 .h인 파일로, C 함수 선언 및 매크로 정의가 포함되어 있으며 여러 소스 파일에서 참조 및 공유됩니다. 헤더 파일에는 프로그래머가 작성한 헤더 파일과 컴파일러가 제공하는 헤더 파일의 두 가지 유형이 있습니다.
프로그램에서 헤더 파일을 사용하려면 C 전처리 지시어 #include를 사용하여 참조해야 합니다. 우리는 이전에 컴파일러와 함께 제공되는 헤더 파일인 stdio.h 헤더 파일을 이미 보았습니다.
헤더 파일을 참조하는 것은 헤더 파일의 내용을 복사하는 것과 동일하지만 소스 파일에서 헤더 파일의 내용을 직접 복사하지는 않습니다. 특히 프로그램이 다음과 같이 구성되어 있는 경우 실수하기 쉽기 때문입니다. 여러 소스 파일.
C 또는 C++ 프로그램의 간단한 연습으로 모든 상수, 매크로, 시스템 전역 변수 및 함수 프로토타입을 헤더 파일에 작성하고 필요할 때 언제든지 이러한 헤더 파일을 참조하는 것이 좋습니다.
헤더 파일 참조 구문
사용자 및 시스템 헤더 파일을 참조하려면 전처리 지시어 #include를 사용하세요. 다음 두 가지 형식이 있습니다.
#include <file>
이 형식은 시스템 헤더 파일을 참조하는 데 사용됩니다. file이라는 파일에 대한 시스템 디렉터리의 표준 목록을 검색합니다. 소스 코드를 컴파일할 때 -I 옵션을 사용하여 목록 앞에 디렉터리를 추가할 수 있습니다.
#include "file"
이 양식은 사용자 헤더 파일을 참조하는 데 사용됩니다. 현재 파일이 포함된 디렉터리에서 file이라는 파일을 검색합니다. 소스 코드를 컴파일할 때 -I 옵션을 사용하여 목록 앞에 디렉터리를 추가할 수 있습니다.
인용 헤더 파일 작업
#include 지시어는 C 전처리기에 지정된 파일을 입력으로 검색하도록 지시합니다. 전처리기의 출력에는 생성된 출력, 참조 파일에서 생성된 출력, #include 지시문 뒤의 텍스트 출력이 포함됩니다. 예를 들어 헤더 파일 header.h가 다음과 같이
char *test (void);
이고 헤더 파일을 사용하는 기본 프로그램 program.c이 있는 경우
int x;#include "header.h"int main (void){ puts (test ());}
컴파일러는 다음과 같이 토큰 스트림을 확인합니다.
int x;char *test (void);int main (void){ puts (test ());}
헤더 파일은 한 번만 참조하세요
헤더 파일이 두 번 참조되면 컴파일러는 헤더 파일의 내용을 두 번 처리하므로 오류가 발생합니다. 이를 방지하기 위해 표준 관행은 파일의 전체 내용을 다음과 같이 조건부 컴파일 문에 넣는 것입니다.
#ifndef HEADER_FILE#define HEADER_FILE the entire header file file#endif
이 구조는 일반적으로 래퍼 #ifndef로 알려져 있습니다. 헤더 파일을 다시 참조하면 HEADER_FILE이 정의되어 있으므로 조건은 false입니다. 이 시점에서 전처리기는 파일의 전체 내용을 건너뛰고 컴파일러는 이를 무시합니다.
조건부 참조
때로는 여러 다른 헤더 파일에서 프로그램에 대한 참조를 선택해야 하는 경우가 있습니다. 예를 들어, 다양한 운영 체제에서 사용할 구성 매개변수를 지정해야 합니다. 다음과 같은 일련의 조건을 통해 이를 달성할 수 있습니다.
#if SYSTEM_1 # include "system_1.h"#elif SYSTEM_2 # include "system_2.h"#elif SYSTEM_3 ...#endif
그러나 헤더 파일이 많은 경우 전처리기가 매크로를 사용하여 헤더 파일 이름을 정의하는 것은 매우 부적절합니다. 이를 조건부 참조라고 합니다. #include에 대한 직접적인 인수로 헤더 파일 이름을 사용하는 대신 매크로 이름을 대신 사용해야 합니다.
#define SYSTEM_H "system_1.h" ... #include SYSTEM_H
SYSTEM_H는 확장되고 전처리기는 #include와 마찬가지로 system_1.h를 찾습니다. 원래는 그렇게 쓰여 있었어요. SYSTEM_H는 -D 옵션을 통해 Makefile에 의해 정의될 수 있습니다.