표준 정말 파일이 .cpp
또는 .h
또는 .monkeyface
인지에 대해 많이 걱정하지 않는다 컴파일러. 소스 코드를 구현 및 헤더 파일로 구조화하는 기본 개념은 소스를 관리하는 데 실제로 허용되는 방법입니다. 그럼에도 불구하고, 허용 된 방식으로 소스를 구조화하지 않는 것이 종종 잘못된 C++로 간주됩니다.
모두 #include
은 현재 파일에 지정한 파일의 내용을 포함하도록 전 처리기에 지시합니다. 다른 파일을 복사하여 붙여 넣는 것과 같습니다. #include "foo.h"
이라고 말하면 단지 foo.h
의 내용을 포함하며 foo.cpp
은 전혀 신경 쓰지 않습니다. 존재한다는 것을 전혀 모릅니다 (존재할 이유가 없습니다).
구현 및 헤더 파일에서 소스 코드를 구조화하는 것은 매우 유용합니다. 종속성 및 다중 정의 문제를 방지하고 컴파일 시간을 다소 향상시킵니다. 코드에서 다른 클래스를 사용하는 경우 해당 클래스의 헤더 파일 만 #include
이면됩니다. 그 이유는 코드가 클래스의 구현을 신경 쓸 필요가 없기 때문에 코드가 어떻게 보이는지 (이름, 멤버, 기본 클래스 등) 알아야하기 때문입니다. 멤버 함수가 얼마나 정확하게 구현되는지는 관련이 없습니다.
확장자 .cpp
및 .h
은 단지 규칙 일뿐입니다. 어떤 사람들은 헤더 파일에 .hpp
을 선호합니다.어떤 사람들은 심지어 템플릿 구현을 위해 .tpp
을 사용합니다. 원하는대로 이름을 지정할 수 있습니다. 예, .txt
파일을 포함 할 수도 있습니다. 컴파일러는 아마도 파일 확장자에서 파일을 컴파일 할 언어 (예 : 어떤 언어로 컴파일할지)를 추측하려고 시도하지만 일반적으로이를 재정의 할 수 있습니다.
따라서 main.cpp
에 foo
클래스를 사용하므로 foo.h
이 포함 된 경우 어떤 시점에 foo.cpp
에 참여하게됩니까? 글쎄, main.cpp
의 편집에서 전혀 개입하지 않습니다. main.cpp
은 앞서 설명한 것처럼 클래스의 구현에 대해 알 필요가 없습니다. 그러나 전체 프로그램을 컴파일 할 때 컴파일러에 각각 .cpp
개의 파일을 전달하여 별도로 컴파일 할 수 있습니다. 즉, g++ main.cpp foo.cpp
과 같은 것을 할 것입니다. foo.cpp
을 컴파일하면 의 컴파일이 필요한 헤더가 포함됩니다.
각 .cpp
파일이 컴파일 된 후 (종속 된 헤더 포함) 컴파일 된 파일은 함께 연결됩니다. main.cpp
에있는 멤버 함수 foo::bar()
의 사용은이 단계에서 foo.cpp
에 주어진 foo::bar()
의 구현과 연결됩니다.
@jonhopkins Woops, 나는 바보처럼 보인다. – antonijn
1.의 경우 전 처리기에는 .cpp가 자동으로 포함되지 않지만 컴파일러에서 .h 파일의 선언을 찾아서 해당 정의를 원할 경우 일부 컴파일러 (예 : Oracle)에서 .cc 또는 .c 파일은 .h 파일의 이름과 일치합니다. 이것은 대부분 실제로 매우 혼란스럽고 피해야합니다. –