수색…


비고

C ++에서 C와 마찬가지로 C ++ 컴파일러와 컴파일 프로세스는 C 전 처리기를 사용합니다. GNU C 전처리 기 매뉴얼에 명시된대로 헤더 파일은 다음과 같이 정의됩니다 :

헤더 파일은 여러 소스 파일간에 공유 할 C 선언 및 매크로 정의 (매크로 참조)가 포함 된 파일입니다. C 사전 처리 지시어 '#include'를 사용하여 프로그램에서 헤더 파일 사용을 요청합니다.

헤더 파일은 두 가지 용도로 사용됩니다.

  • 시스템 헤더 파일은 운영 체제의 일부에 대한 인터페이스를 선언합니다. 프로그램과 라이브러리를 호출하는 데 필요한 정의와 선언을 프로그램에 포함시킵니다.
  • 자신의 헤더 파일에는 프로그램의 소스 파일 간의 인터페이스에 대한 선언이 포함되어 있습니다. 관련 선언 및 매크로 정의 그룹이있을 때마다 여러 소스 파일에서 모두 또는 대부분을 필요로 할 때마다 헤더 파일을 만드는 것이 좋습니다.

그러나 C 전처리 기 자체에 대한 헤더 파일은 소스 파일과 다를 바 없습니다.

헤더 / 소스 파일 구성 체계는 인터페이스와 구현 간의 분리를 제공하기 위해 다양한 소프트웨어 프로젝트에서 설정 한 강력하고 표준적인 컨벤션입니다.

C ++ 표준 자체에 의해 공식적으로 시행되지는 않지만 헤더 / 소스 파일 규칙을 따르는 것이 좋습니다. 실제로 실제로는 거의 유비쿼터스입니다.

헤더 파일은 모듈의 향후 기능에 의해 프로젝트 파일 구조 규칙으로 대체 될 수 있으며, 작성 시점 (예 : C ++ 20)에서는 향후 C ++ 표준에 포함되는 것으로 간주됩니다.

기본 예제

다음 예는 // filename 주석으로 표시되는 여러 소스 파일로 분할 될 코드 블록을 포함합니다.

소스 파일

// my_function.h

/* Note how this header contains only a declaration of a function.
 * Header functions usually do not define implementations for declarations
 * unless code must be further processed at compile time, as in templates.
 */

/* Also, usually header files include preprocessor guards so that every header
 * is never included twice.
 *
 * The guard is implemented by checking if a header-file unique preprocessor
 * token is defined, and only including the header if it hasn't been included
 * once before.
 */
#ifndef MY_FUNCTION_H
#define MY_FUNCTION_H

// global_value and my_function() will be
// recognized as the same constructs if this header is included by different files.
const int global_value = 42;
int my_function();

#endif // MY_FUNCTION_H

// my_function.cpp

/* Note how the corresponding source file for the header includes the interface  
 * defined in the header so that the compiler is aware of what the source file is 
 * implementing.
 *
 * In this case, the source file requires knowledge of the global constant
 * global_value only defined in my_function.h. Without inclusion of the header
 * file, this source file would not compile.
 */
#include "my_function.h" // or #include "my_function.hpp"
int my_function() {
  return global_value; // return 42;
}

헤더 파일은 헤더 인터페이스에 의해 정의 된 기능을 사용하고자하는 다른 소스 파일에 포함되지만 구현에 대한 지식이 필요하지 않습니다 (따라서 코드 결합을 줄임). 다음 프로그램은 위에 정의 된대로 my_function.h 헤더를 사용합니다.

// main.cpp

#include <iostream>       // A C++ Standard Library header.
#include "my_function.h"  // A personal header

int main(int argc, char** argv) {
  std::cout << my_function() << std::endl;
  return 0;
}

컴파일 과정

헤더 파일은 종종 컴파일 프로세스 워크 플로의 일부이므로 헤더 / 소스 파일 규칙을 사용하는 일반적인 컴파일 프로세스는 일반적으로 다음을 수행합니다.

헤더 파일과 소스 코드 파일이 이미 같은 디렉토리에 있다고 가정하면 프로그래머는 다음 명령을 실행합니다.

g++ -c my_function.cpp       # Compiles the source file my_function.cpp
                             # --> object file my_function.o

g++ main.cpp my_function.o   # Links the object file containing the 
                             # implementation of int my_function()
                             # to the compiled, object version of main.cpp
                             # and then produces the final executable a.out

또는 main.cpp 를 먼저 오브젝트 파일로 컴파일 한 다음 오브젝트 파일 만 링크하여 최종 단계로 만들려면 다음을 수행하십시오.

g++ -c my_function.cpp
g++ -c main.cpp

g++ main.o my_function.o

헤더 파일의 템플릿

템플릿은 컴파일 타임에 코드를 생성해야합니다. 예를 들어 템플릿 기능은 소스 코드에서 사용하여 템플릿 기능이 매개 변수화되면 효과적으로 여러 개의 고유 한 기능으로 변환됩니다.

이는 템플리트 함수, 구성원 함수 및 클래스 정의를 별도의 소스 코드 파일에 위임 할 수 없음을 의미합니다. 템플릿 화 된 구문을 사용하는 코드는 일반적으로 파생 코드를 생성하기 위해 해당 정의에 대한 지식이 필요합니다.

따라서 헤더에 삽입 된 템플릿 코드는 정의를 포함해야합니다. 예를 들면 다음과 같습니다.

// templated_function.h

template <typename T>
T* null_T_pointer() {
  T* type_point = NULL; // or, alternatively, nullptr instead of NULL
                        // for C++11 or later
  return type_point;
} 


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow