언급 한대로 파일을 포함 할 수 있지만 .cpp
이것은 나쁜 생각입니다.
언급했듯이 선언은 헤더 파일에 속합니다. 구현이 포함되어 있지 않기 때문에 여러 컴파일 단위에 포함될 때 문제가 발생하지 않습니다. 함수 또는 클래스 멤버의 정의를 여러 번 포함하면 링커가 혼란스러워지고 오류가 발생하기 때문에 항상 문제는 아닙니다 (항상 그런 것은 아님).
각 .cpp
파일에는 클래스, 논리적으로 구성된 함수 그룹, 전역 정적 변수 (예 : 조금만 사용) 등과 같은 프로그램의 하위 세트에 대한 정의가 포함됩니다.
각 컴파일 단위 ( .cpp
파일)에는 포함 된 정의를 컴파일하는 데 필요한 선언이 포함됩니다. 그것은 참조하지만 포함하지 않은 함수와 클래스를 추적하므로 링커는 나중에 객체 코드를 실행 파일이나 라이브러리에 결합 할 때이를 해결할 수 있습니다.
예
Foo.h
-> 클래스 Foo에 대한 선언 (인터페이스)을 포함합니다.
Foo.cpp
-> 클래스 Foo에 대한 정의 (구현)를 포함합니다.
Main.cpp
-> 주요 방법, 프로그램 진입 점을 포함합니다. 이 코드는 Foo를 인스턴스화하여 사용합니다.
모두 Foo.cpp
와 Main.cpp
필요 포함합니다 Foo.h
. Foo.cpp
클래스 인터페이스를 지원하는 코드를 정의하기 때문에 필요하므로 해당 인터페이스가 무엇인지 알아야합니다. Main.cpp
Foo를 생성하고 동작을 호출하기 때문에 필요하므로 해당 동작이 무엇인지, 메모리의 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
또는 .docx
C ++로 컴파일하도록 쉽게 지시 할 수 .o
있으며 일반 텍스트 형식의 유효한 C ++ 코드가 포함되어 있으면 객체 ( ) 파일을 생성합니다. 이 확장은 프로그래머의 이익을위한 것입니다. 내가 볼 경우 Foo.h
와 Foo.cpp
, 나는 즉시 먼저 클래스의 선언을 포함하고 두 번째 정의가 포함되어 있다고 가정합니다.