>  기사  >  백엔드 개발  >  h 파일과 c 파일의 관계는 무엇입니까?

h 파일과 c 파일의 관계는 무엇입니까?

醉折花枝作酒筹
醉折花枝作酒筹원래의
2021-06-28 10:45:1014783검색

h 파일은 .c(.cpp) 파일의 헤드에 배치되는 경우가 많아 "헤더 파일"이라고 명명됩니다. h 파일은 .c 파일에서 반복되는 선언문을 추출하여 새 파일에 넣은 다음 필수 .c(.cpp) 파일에 "#include XXXX"와 같은 문을 입력하는 파일입니다.

h 파일과 c 파일의 관계는 무엇입니까?이 튜토리얼의 운영 환경: Windows 7 시스템, C++17 버전, Dell G3 컴퓨터.

C 언어 프로젝트에서 .h 파일과 .c 파일의 관계에 대한 자세한 설명

컴파일러가 .c(.cpp)) 파일만 인식하고 .h가 무엇인지 몰랐던 시대에 당시 사람들은 많은 .c(.cpp) 파일을 작성했지만 점차적으로 사람들은 많은 .c(.cpp) 파일의 선언문이 동일하지만 이러한 내용을 각 단어에 하나씩 반복적으로 입력해야 한다는 사실을 알게 되었습니다. .cpp) 파일입니다. 하지만 더욱 무서운 점은 선언 중 하나가 변경되면 모든 .c(.cpp) 파일을 확인해야 한다는 것입니다.

그래서 사람들은 반복되는 부분을 추출하여 새 파일에 넣은 다음 필수 .c(.cpp) 파일에 #include XXXX와 같은 문을 입력합니다. 이렇게 하면 특정 구문이 변경되더라도 여기저기서 검색하고 수정할 필요가 없습니다. 이 새 파일은 종종 .c(.cpp) 파일의 헤드에 배치되므로 이름이 "헤더 파일"이고 확장자는 .h입니다.

우리 언어를 배우는 초기 단계에서 우리 프로그램은 종종 하나의 .c 파일 또는 그 중 몇 개만 가지고 있습니다. 현재 프로그램이 증가함에 따라 코드가 수천 개 또는 심지어 몇 개로 늘어나는 문제가 거의 발생하지 않습니다. 수만 라인이 측정되었으며 파일 수도 증가하고 있습니다. 이때 이러한 파일의 구성이 문제가 됩니다. 사실 직설적으로 말하면 이러한 파일의 구성은 이론적으로 소프트웨어 엔지니어링 등의 모듈 설계의 문제입니다.

헤더 파일의 역할에 대한 간략한 설명:

(1) 헤더 파일을 통해 라이브러리 함수를 호출합니다. 많은 경우, 헤더 파일과 바이너리 라이브러리가 사용자에게 제공되는 한 소스 코드를 사용자에게 공개하는 것은 불편하거나 허용되지 않습니다. 사용자는 인터페이스가 어떻게 구현되는지 신경쓰지 않고 헤더 파일의 인터페이스 선언에 따라 라이브러리 함수만 호출하면 됩니다. 컴파일러는 라이브러리에서 해당 코드를 추출합니다.

(2) 헤더 파일은 유형 안전 검사를 강화할 수 있습니다. 인터페이스가 헤더 파일의 선언과 일치하지 않는 방식으로 구현되거나 사용되면 컴파일러는 오류를 지적합니다. 이 간단한 규칙은 오류를 디버깅하고 수정하는 프로그래머의 부담을 크게 줄일 수 있습니다.

예를 들어 aaa.h에서 함수 선언을 정의한 다음 aaa.h와 동일한 디렉터리에 aaa.c를 생성합니다. 이 함수의 구현은 aaa.c에서 정의된 다음 주요 함수입니다. 이 aaa.h를 .c 파일에 #include한 다음 이 기능을 사용할 수 있습니다. main이 실행되면 이 함수를 정의하는 aaa.c 파일을 찾습니다. 그 이유는 주 함수가 표준 C/C++의 프로그램 진입점이고 컴파일러가 먼저 함수가 있는 파일을 찾기 때문입니다.

컴파일러가 myproj.c(main() 포함)를 컴파일할 때 mylib.h(void test() 함수 선언)가 포함되어 있음을 발견한 다음 컴파일러가 미리 설정된 경로(포함 경로 목록 포함)를 따른다고 가정합니다. 및 코드 파일이 있는 경로) 파일이 발견되고 해당 파일에서 함수가 발견되면 동일한 이름(확장자 .cpp 또는 .c, 이 경우 mylib.c)을 가진 구현 파일을 찾습니다. 이 경우는 void test())의 구현 코드입니다. 컴파일을 계속하세요.

지정된 디렉터리에서 구현 파일을 찾을 수 없거나, 파일 및 후속 포함 파일에서 구현 코드를 찾을 수 없으면 컴파일 오류가 반환됩니다. 실제로 포함 프로세스는 파일로 "표시"될 수 있습니다. 스플라이싱 과정에서는 선언과 구현이 각각 헤더 파일과 C 파일에 작성되거나 두 파일이 동시에 헤더 파일에 작성되면 이론상 본질적인 차이는 없습니다.

이론적으로 C 파일과 헤더 파일의 내용이 C 언어에서 지원된다면 무엇이든 작성할 수 있습니다. 예를 들어 헤더 파일에 함수 본문을 작성한다면 이 헤더 파일만 포함하면 됩니다. 모든 C 파일에서 이 함수는 대상 파일의 일부로 컴파일될 수 있습니다(컴파일은 C 파일을 기반으로 합니다. 이 헤더 파일이 C 파일에 포함되지 않으면 이 코드는 쓸모가 없습니다). C 파일 선언, 구조 선언, 이것은 문제가 되지 않습니다! ! ! 그렇다면 왜 헤더 파일과 C 파일로 나누어야 할까요? 그리고 함수, 변수 선언, 매크로 선언, 구조 선언은 왜 일반적으로 헤더에서 만들어지나요? C 파일에서 변수를 정의할 때 함수 구현은 어떻게 되나요? ?

C 파일과 헤더 파일의 차이점을 이해하려면 먼저 컴파일러의 작업 프로세스를 이해해야 합니다. 일반적으로 컴파일러는 다음 프로세스를 수행합니다.

1. 어휘 및 구문 분석. 단계

3. 컴파일 단계, 먼저 순수 어셈블리 문으로 컴파일한 다음 이를 CPU와 관련된 바이너리 코드로 어셈블하여 각 대상 파일을 생성합니다

4. 연결 단계에서는 특정 플랫폼과 관련된 실행 파일을 생성하기 위해 각 대상 파일의 각 코드에 대해 절대 주소가 배치됩니다. 프로젝트의 C 파일이 아닌 경우, 커넥터는 대상 파일을 기반으로 컴파일되지 않습니다. 하나 이상의 대상 파일을 함수 및 변수로 재배치하여 PC에서 최종 실행 파일을 생성합니다. 인터넷에서 일반적으로 주요 기능은 각 컴파일러의 규칙입니다. 최종 실행 파일을 생성하기 위해서는 몇 가지 타겟 파일, 즉 C 파일이 필요하며, 이러한 C 파일에는 실행 프로그램의 진입점이 되는 main 함수가 필요합니다.

간단히 말하면 C언어의 컴파일은 전처리, 컴파일, 어셈블리, 링크로 나누어집니다. (test.c test.h => test.i => test.s => test.o => ; 테스트) 4가지 주요 단계. c 파일의 #include 매크로 처리는 전처리 단계에서 c에서 참조하는 h 파일의 모든 내용을 c 파일에 쓰고 최종적으로 .i 중간 파일을 생성합니다. 이때 h 파일의 내용은 다음과 같습니다. c 파일을 작성하는 것과 동일합니다.

또한 코드 재사용을 위한 채널을 제공합니다. 많은 c 파일이 동일한 h 파일을 참조할 수 있으므로 h 파일은 여러 c 파일에 배치되고 여러 번 컴파일됩니다. 정의를 넣을 때만 선언을 넣을 수 있다는 점은 정의를 넣으면 여러 번 컴파일된다는 점입니다. 프로그램이 링크되면(여러 int a; 강력한 기호 정의가 시스템에 정의됨) 선언이 다릅니다. . 선언은 정의에 대한 변경 사항을 나타내므로 확장은 결국 정의로 끝나므로 연결 시 정의가 반복되는 오류가 발생하지 않습니다.

프로그래밍에서 우리는 h 파일에서 다음 형식을 사용했음에 틀림없습니다

#ifndef  XXX_H
#define  XXX_H
 //……
#endif

하하, 그렇다면 그 용도는 무엇입니까? h 파일이 서로 참조할 때 중복 정의를 제거할 수 있습니다. 물론 매크로 정의는 전처리 단계에서 역할을 하며, 컴파일 후 과정에서는 매크로의 그림자가 없습니다.

A.h
int a();
  
B.h
#include "A.h"
  
C.h
#include "A.h"
  
D.h
#include "A.h"
#include "B.h"

위의 D.h 파일에는 두 개의 int a(); 선언이 반복되는데, 이는 약간 반복적입니다. 이때 조건부 컴파일 매크로가 유용합니다.

A.h
#ifndef A_H
#define A_H
int a();
#endif

이렇게 하면 반복되는 정의가 없습니다.

추천 튜토리얼: "C#"

위 내용은 h 파일과 c 파일의 관계는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.