산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

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());
}

컴파일러는 program.c가 다음과 같이 읽히는 것과 동일한 토큰 스트림을 보게 됩니다.

int x;
char *test(void);
int main(void) {
    puts(test());
}

단일 포함 헤더

헤더 파일이 두 번 포함되면 컴파일러가 내용을 두 번 처리하여 에러가 발생합니다. 이를 방지하는 표준 방법은 파일의 실제 전체 내용을 조건문으로 감싸는 것입니다.

#ifndef HEADER_FILE
#define HEADER_FILE
헤더 파일의 전체 내용
#endif

이 구조는 일반적으로 래퍼 #ifndef로 알려져 있습니다. 헤더가 다시 포함되면 HEADER_FILE이 정의되어 있으므로 조건이 거짓이 됩니다. 전처리기는 파일의 전체 내용을 건너뛰고, 컴파일러는 이를 두 번 보지 않게 됩니다.

계산된 포함

때로는 여러 다른 헤더 파일 중 하나를 프로그램에 포함하도록 선택해야 할 필요가 있습니다. 예를 들어, 서로 다른 운영 체제에서 사용할 구성 매개변수를 지정할 수 있습니다. 다음과 같이 일련의 조건문으로 처리할 수 있습니다.

#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는 Makefile에서 -D 옵션으로 정의할 수 있습니다.

C 언어

  1. C 파일 입출력: fopen, fprintf, fread, fseek 마스터하기
  2. Python 파일 입출력: 파일 연산, 읽기, 쓰기, 관리 마스터하기
  3. java.io로 Java 파일 작업 마스터하기 – 생성, 읽기, 쓰기 및 삭제
  4. STL 파일 이해하기: 3D 프린팅의 중추
  5. Verilog 파일 I/O 마스터하기: 열기, 읽기, 쓰기, 닫기
  6. C 파일 입출력 완벽 가이드: 열기, 읽기, 쓰기, 위치 제어, 바이너리 처리
  7. C++ 파일 입출력 마스터하기: fstream으로 읽고 쓰기
  8. C# 파일 입출력 마스터하기: 스트림, 읽기/쓰기, 고급 파일 작업
  9. 파이썬 파일 입출력: I/O 작업 마스터하기
  10. 삼각 줄(트라이앵귤러 파일) 완벽 가이드: 설계, 용도, 관리법