언급 한대로 파일을 포함 할 수 있지만 .cpp이것은 나쁜 생각입니다.
언급했듯이 선언은 헤더 파일에 속합니다. 구현이 포함되어 있지 않기 때문에 여러 컴파일 단위에 포함될 때 문제가 발생하지 않습니다. 함수 또는 클래스 멤버의 정의를 여러 번 포함하면 링커가 혼란스러워지고 오류가 발생하기 때문에 항상 문제는 아닙니다 (항상 그런 것은 아님).
각 .cpp파일에는 클래스, 논리적으로 구성된 함수 그룹, 전역 정적 변수 (예 : 조금만 사용) 등과 같은 프로그램의 하위 세트에 대한 정의가 포함됩니다.
각 컴파일 단위 ( .cpp파일)에는 포함 된 정의를 컴파일하는 데 필요한 선언이 포함됩니다. 그것은 참조하지만 포함하지 않은 함수와 클래스를 추적하므로 링커는 나중에 객체 코드를 실행 파일이나 라이브러리에 결합 할 때이를 해결할 수 있습니다.
예
Foo.h -> 클래스 Foo에 대한 선언 (인터페이스)을 포함합니다.
Foo.cpp -> 클래스 Foo에 대한 정의 (구현)를 포함합니다.
Main.cpp-> 주요 방법, 프로그램 진입 점을 포함합니다. 이 코드는 Foo를 인스턴스화하여 사용합니다.
모두 Foo.cpp와 Main.cpp필요 포함합니다 Foo.h. Foo.cpp클래스 인터페이스를 지원하는 코드를 정의하기 때문에 필요하므로 해당 인터페이스가 무엇인지 알아야합니다. Main.cppFoo를 생성하고 동작을 호출하기 때문에 필요하므로 해당 동작이 무엇인지, 메모리의 Foo 크기 및 함수를 찾는 방법 등을 알아야하지만 실제 구현은 아직 필요하지 않습니다.
컴파일러는 생성 Foo.o에서 Foo.cpp컴파일 된 형태로 푸 클래스의 코드를 모두 포함한다. 또한 Main.o주 메소드와 Foo 클래스에 대한 해석되지 않은 참조를 포함하는 생성 합니다.
이제 두 개의 객체 파일 Foo.o과 Main.o실행 파일 을 결합하는 링커가 제공 됩니다. 그것은 해결되지 않은 Foo 참조를 Main.o보지만 Foo.o필요한 기호 를 포함하는 것을 보 므로 "점을 연결하여" 말해 줍니다. 함수 호출 Main.o은 이제 컴파일 된 코드의 실제 위치에 연결되어 런타임시 프로그램이 올바른 위치로 이동할 수 있습니다.
에 Foo.cpp파일을 포함시킨 경우 Foo 클래스에 대한 두 가지 정의 Main.cpp가 있습니다 . 링커는 이것을보고 "어느 것을 선택해야할지 모르므로 오류입니다."라고 말합니다. 컴파일 단계는 성공하지만 연결은 실패합니다. (컴파일하지 않고 왜 별도의 파일에 있습니까?)Foo.cpp.cpp
마지막으로, 다른 파일 형식에 대한 아이디어는 C / C ++ 컴파일러와 관련이 없습니다. 원하는 언어에 대한 유효한 코드를 포함하는 "텍스트 파일"을 컴파일합니다. 때로는 파일 확장자에 따라 언어를 말할 수 있습니다. 예를 들어, .c컴파일러 옵션이없는 파일을 컴파일하면 C로 가정하고 a .cc또는 .cpp확장자는 C ++로 가정합니다. 그러나 컴파일러에게 파일 .h또는 .docxC ++로 컴파일하도록 쉽게 지시 할 수 .o있으며 일반 텍스트 형식의 유효한 C ++ 코드가 포함되어 있으면 객체 ( ) 파일을 생성합니다. 이 확장은 프로그래머의 이익을위한 것입니다. 내가 볼 경우 Foo.h와 Foo.cpp, 나는 즉시 먼저 클래스의 선언을 포함하고 두 번째 정의가 포함되어 있다고 가정합니다.