Programing

C 및 C++ 프로젝트에 포함/디렉토리를 만드는 이유는?

c10106 2022. 5. 21. 08:46
반응형

C 및 C++ 프로젝트에 포함/디렉토리를 만드는 이유는?

내가 개인 C와 C++ 프로젝트를 할 때 나는 보통 넣는다.file.h그리고file.cpp 은색에.file.cpp참조할 수 있다file.hA과 함께#include "file.h"지시의

그러나, 모든 것이 있는 도서관이나 다른 종류의 프로젝트들 (Linux 커널이나 freeRTOS와 같은)을 찾는 것이 일반적이다..h파일이 안에 배치됨include/).cpp파일은 다른 디렉토리에 남아있다.그 프로젝트들에서는.h에 되어 있다.#include "file.h"대신에#include "include/file.h"내가 바라던 대로

이 모든 것에 대해 몇 가지 궁금한 점이 있다.

  1. 이 파일 구조 조직의 장점은 무엇인가?
  2. 왜 그럴까?.h안에 있는 파일include/에 포함된.#include "file.h"대신에#include "include/file.h"? 진짜 트릭이 Makefile 안에 있다는 것은 알지만, 우리가 포함시키고자 하는 파일이 실제로 그 안에 있다는 것을 분명히 하는 대신에 그렇게 하는 것이 정말 더 좋은가?include/전화번호부?

이렇게 하는 주된 이유는 컴파일된 라이브러리는 최종 사용자가 사용하기 위해 헤더가 필요하기 때문이다.관례에 따라, 그 내용은include디렉토리는 공개 사용을 위해 노출된 헤더 입니다.원본 디렉토리에 내부 사용을 위한 헤더가 있을 수 있지만, 그것들은 컴파일된 라이브러리와 함께 배포되지 않는다.

따라서 라이브러리를 사용할 때 바이너리에 연결한 후 라이브러리를 추가하십시오.include빌드 시스템의 헤더 경로에 대한 디렉토리.마찬가지로 컴파일된 라이브러리를 중앙 위치에 설치하면 중앙 위치에 복사해야 할 파일(컴파일된 이진 파일 및 파일)을 알 수 있다.include디렉터리) 및 그렇지 않은 파일(소스 디렉터리 등)

옛날에는 그랬다.<header>할 수 문장은 암묵적으로, 에로, 에로 수정이 있다.includes환경 변수 경로 또는 빌드 매크로 및"header"스타일 포함은 명시적 형식(as-in)으로, 원본 파일이 포함될 때마다 정확히 상대적인 형식이었다.일부 빌드 툴 체인은 여전히 이러한 구분을 허용하지만, 그것들은 종종 그것을 효과적으로 무효화하는 구성을 디폴트한다.

당신의 질문은 흥미롭다. 왜냐하면 그것이 정말로 어떤 것이 더 나은가, 암묵적인가, 아니면 노골적인가 하는 질문을 꺼내기 때문이다.암묵적 형태는 다음과 같은 이유로 확실히 더 쉽다.

  1. 디렉토리의 계층 구조에서 관련 헤더의 편리한 그룹화.
  2. 에 몇 개의 디렉터리만 포함하면 됨includes경로 및 정확한 파일 위치와 관련된 모든 세부 정보를 알 필요는 없다.코드를 변경하지 않고 라이브러리 및 관련 헤더 버전을 변경할 수 있다.
  3. 건조하다.
  4. 신축성!너의 빌드 환경이 내 것과 일치할 필요는 없지만, 우리는 종종 거의 똑같은 결과를 얻을 수 있다.

반면에 명시적인 것은 다음과 같다.

  1. 반복 가능한 빌드.【例句】 의 순서 변경includes매크로/매크로 변수, 빌드 중에 발견된 결과 헤더 파일은 변경되지 않음.
  2. 휴대용 빌드.모든 걸 다 포장해서 다른 개발실로 보내면 돼
  3. 정보의 근접성.머리글이 어디에 있는지 정확히 알고 있다.#include "\X\Y\Z"에서는 여러 할 수 의 여러 알 수 있는가 암묵적 형식에서는 여러 경로를 따라 검색해야 할 수 있으며 동일한 파일의 여러 버전을 찾을 수도 있는데, 빌드에서 어떤 버전이 사용되는지 어떻게 알 수 있는가?

건설업자들은 이 두 가지 접근방식에 대해 수십 년 동안 논쟁을 벌여왔지만, 이 두 가지 접근방식의 복합적인 형태는 대부분 순수한 명시적 형태에 근거한 건축물을 유지하는 데 필요한 노력과 한 사람이 순수하게 내재된 성격의 코드에 익숙해질 수 있는 명백한 어려움 때문에 이긴다.우리 모두는 일반적으로 우리의 다양한 툴 체인이 특정한 공통의 라이브러리와 헤더를 특정한 위치에 배치하여 사용자와 프로젝트 간에 공유할 수 있도록 한다는 것을 이해하고 있기 때문에 표준 C/C+ 헤더를 한 곳에서 찾을 것으로 기대하지만, 처음에는 임의의 프로젝트의 특정 구조에 대해 전혀 알지 못하며, 지역적으로 우리가 필요로 하는 것이 없다.ll 문서화된 규약으로, 따라서 우리는 이들 프로젝트에서 고유하고 표준 비트와 관련하여 내포된 비표준 비트에 대해 명시적일 것으로 예상한다.

항상 사용하는 것은 좋은 습관이다.<header>프로젝트별로 특정되지 않은 모든 표준 헤더 및 기타 라이브러리에 대한 포함 형식 및"header"하다하다 을하다 당신의 로컬 포함 프로젝트에 포함 디렉터리가 있어야 하는가?이는 해당 헤더가 라이브러리에 대한 인터페이스로 제공되는지, 아니면 코드에서 사용하는지, 그리고 사용자의 선호도에 따라 어느 정도 달라진다.당신의 프로젝트는 얼마나 크고 복잡한가?내부 및 외부 인터페이스가 혼합되어 있거나 여러 가지 구성 요소가 있는 경우 여러 항목을 별도의 디렉토리로 그룹화하십시오.

디렉터리 구조는 완성된 제품을 분리할 수 있으므로 제품을 개발하고 구축하는 디렉터리 구조와 같은 모양을 만들 필요가 없다는 점을 유념하십시오..c/.cpp 파일 및 헤더가 몇 개만 있으면 모두 하나의 디렉터리에 넣어도 괜찮지만, 결국엔 비교가 되지 않는 작업을 하게 되고, 자신의 빌드 환경 선택의 결과를 숙고해야 하며, 바라건대 다른 사람들이 이해할 수 있도록 문서화해야 한다.

1.hpp와 .cpp는 1대 1의 관계를 가질 필요가 없으며, 다른 조건(예: 환경)에 따라 동일한 .hpp를 사용하는 여러 .cpp가 있을 수 있다. 예를 들어, 멀티플랫폼 라이브러리, 앱의 버전을 얻을 클래스가 있다고 상상하면 헤더는 다음과 같다.

유틸리티.h

#include <string.h>
class Utilities{
    static std::string getAppVersion();
}

main.cpp

#include Utilities.h
int main(){
    std::cout << Utilities::getAppVersion() << std::ends;
    return 0;
}

각 플랫폼에 대해 하나의 .cpp가 있을 수 있으며, .cpp는 해당 플랫폼에 의해 쉽게 선택될 수 있도록 서로 다른 위치에 배치될 수 있다.

iOS용 .cpp(경로:데모프로젝트/ios/Utilities.cpp):

#include "Utilities.h"
std::string Utilities::getAppVersion(){
    //some objective C code
}

.cpp for Android(경로:데모프로젝트/android/Utilities.cpp):

#include "Utilities.h"
std::string Utilities::getAppVersion(){
    //some jni code
}

그리고 물론 일반적으로 2 .cpp는 동시에 사용되지 않을 것이다.


2.

#include "file.h" 

대신에

#include "include/file.h" 

헤더가 더 이상 "internal" 폴더에 배치되지 않을 때 소스 코드를 변경하지 않고 유지할 수 있다.

참조URL: https://stackoverflow.com/questions/48554758/why-create-an-include-directory-in-c-and-c-projects

반응형