먼저, 첫 번째 질문을 해결하십시오.
.h 파일 에서 이것을 볼 때 :
#ifndef FILE_H
#define FILE_H
/* ... Declarations etc here ... */
#endif
이것은 헤더 파일이 여러 번 포함되는 것을 방지하는 전 처리기 기술로, 여러 가지 이유로 문제가 될 수 있습니다. 프로젝트를 컴파일하는 동안 각 .cpp 파일 (일반적으로)이 컴파일됩니다. 간단히 말하면 컴파일러가 .cpp 파일 을 가져 와서 파일을 열고 #included하나의 거대한 텍스트 파일로 연결 한 다음 구문 분석을 수행하고 마지막으로 중간 코드로 변환하고 다른 코드를 최적화 / 수행합니다 마지막으로 대상 아키텍처에 대한 어셈블리 출력을 생성합니다. 이 때문에 파일이 #included하나의 .cpp 아래에 여러 번 있는 경우파일에서 컴파일러는 파일 내용을 두 번 추가하므로 해당 파일 내에 정의가 있으면 변수를 다시 정의했다는 컴파일러 오류가 발생합니다. 파일이 컴파일 프로세스의 전 처리기 단계에 의해 처리 될 때, 내용이 처음 도달 할 때 처음 두 줄은 FILE_H전처리기에 대해 정의되어 있는지 확인합니다 . 그렇지 않으면 FILE_H코드와 #endif지시문 사이의 코드를 정의 하고 계속 처리합니다 . 다음 번에 프리 프로세서가 파일 내용을 볼 때, 검사 FILE_H는 거짓이므로 즉시 스캔 #endif한 후 계속 진행합니다. 이는 재정의 오류를 방지합니다.
그리고 두 번째 관심사를 해결하기 위해 :
일반적으로 C ++ 프로그래밍에서는 개발을 두 가지 파일 형식으로 분리합니다. 하나는 확장자가 .h 이며이를 "헤더 파일"이라고합니다. 일반적으로 함수, 클래스, 구조체, 전역 변수, typedef, 전처리 매크로 및 정의 등의 선언을 제공합니다. 기본적으로 코드에 대한 정보 만 제공합니다. 그런 다음 "코드 파일"이라고하는 확장명이 .cpp 입니다. 이것은 함수, 클래스 멤버, 정의가 필요한 모든 구조체 멤버, 전역 변수 등에 대한 정의를 제공합니다. 따라서 .h 파일은 코드 를 선언 하고 .cpp 파일은 해당 선언을 구현합니다. 이러한 이유로 컴파일 할 때 일반적으로 각 .cpp를 컴파일합니다.하나의 .cpp 파일이 다른 .cpp 파일을 포함하는 것을 거의 볼 수 없기 때문에 파일을 객체에 연결 한 다음 해당 객체를 연결하십시오 .
이러한 외부 장치를 해결하는 방법은 링커의 작업입니다. 컴파일러가 main.cpp를 처리 할 때 class.h 를 포함 시켜 class.cpp 의 코드에 대한 선언을 가져 옵니다 . 이러한 함수 나 변수가 어떤 모양인지 (알선이 제공하는 것) 만 알면됩니다. 따라서 main.cpp 파일을 일부 객체 파일로 컴파일합니다 ( main.obj 라고 함 ). 마찬가지로 class.cpp은 (A) 내로 컴파일 class.obj파일. 최종 실행 파일을 생성하기 위해 링커가 호출되어이 두 개체 파일을 함께 연결합니다. 해결되지 않은 외부 변수 또는 함수의 경우 컴파일러는 액세스가 발생하는 위치에 스텁을 배치합니다. 링커는이 스텁을 가져 와서 나열된 다른 오브젝트 파일에서 코드 또는 변수를 찾은 후 발견되면 두 오브젝트 파일의 코드를 출력 파일로 결합하고 스텁을 함수의 최종 위치 또는 변하기 쉬운. 이런 식으로 main.cpp의 코드는 함수를 호출하고 class.cpp의 변수를 사용할 수 있습니다. 선언 된 경우 에만 class.h .
도움이 되었기를 바랍니다.