2013-07-30 1 views
3

도서관에 관한 질문이 있습니다. 라이브러리를 작성할 때 library.hlibrary.cpp의 두 파일이 있습니다.헤더에 library.cpp를 포함시켜야하는 이유는 무엇입니까?

첫 번째 함수는 함수의 프로토 타입을 포함하고 두 번째 함수는 정의를 포함합니다. 음, library.cpp에는 #include "library.h"이 포함되어 있으므로 한 방향으로 연결되어 있지만 헤더는 어떻게됩니까? 헤더에 #include "library.cpp"을 써야하는 이유는 무엇입니까?

주 파일에서 라이브러리를 사용할 때 프로토 타입이 포함 된 #include "library.h"으로 작성하지만 컴파일러는 정의가 어디에 있는지 어떻게 알 수 있습니까?

답변

10

간략하게 설명했다.

(2) 전 처리기는 라인 #include "library.h"을 읽고 파일 library.h을 찾습니다.

(3) library.h의 내용은 문자 그대로 library.cpp 파일에 복사됩니다.

(4) library.cpp 파일이 컴파일되어 주 파일과 연결됩니다.

따라서 헤더의 모든 "프로토 타입"은 구현 파일의 맨 위에 복사됩니다. .cpp 파일이 컴파일되고 링크됩니다. 헤더 파일 자체는 이 아니며이 컴파일되지 않습니다. 해당 내용은 .cpp 파일에 복사됩니다.

+0

(1)'library.cpp' 파일이 전 처리기로 보내지는 이유는 무엇입니까? CMake 사용에만 적용됩니까? 만약 내가'#include "mylibrary.h"파일에 단순히'g ++'을 사용한다면, 작동하지 않는 것 같습니까? – SOFe

0

모든 cpp 파일은 별도로 컴파일되며 코드는 큰 더미에 축적됩니다. 링커는 코드의 모든 심볼을 수집하고이 더미 내에 주소를 할당합니다. 따라서 파일에 library.cpp가 직접 표시되지는 않지만 library.h의 심볼과 할당 된 주소를 알고 있습니다. 그런 다음 큰 파일에서 필요한 코드로 직접 확대/축소 할 수 있습니다. 내가 아는 가장 기술적 인 대답이 아니다.

+0

-1 이것은 너무 정확하지 않으므로 그 사실을 알고있었습니다. –

+0

분명히 단순화라고 생각했습니다. 당신의 대답은 어디입니까? –

+2

왜 그렇게 기분이 좋을지 잘 모릅니다. 그러나 저에게 응답하는 요지는 없습니다. 이미 받아 들인 대답이 있습니다. 나는 동의합니다. 그래서 나는 그 대답에 대해 위로 투표했고, 내가 가난하거나 틀렸다고 생각한 다른 사람들에게도 투표를 의뢰했습니다. 이것이 StackOverflow가 작동하는 방법입니다. 믹스에 다른 대답을 추가하여 나 자신을 증명할 필요가 없습니다. 내 능력에 의문을 제기하는 경우 [내 프로필을 검토하십시오] (http://stackoverflow.com/users/119527/jonathon-reinhart)를 사용하면됩니다. –

1

전처리 기가 헤더 파일을 CPP 파일로 가져와 컴파일러가 프로토 타입과 정의를 함께 보게한다.

당신이 헤더 파일에 CPP 파일을 끌어 것 인 경우에, 당신이, 또는 헤더와 소스 파일 주위

#ifndef __FOOBAR__ 
#define __FOOBAR__ 
(code file) 
#endif 

을 사용하여 무한 루프에 전처리를 보낼 것 중 하나 파일을 방금 읽은 것 일단.

+0

그 질문에 대답하지 않습니다. –

+0

아. 나는 OP의 첫 번째 질문에만 답했다. 미안합니다. 두 번째 질문 - 라이브러리는 미리 컴파일되고 링커는 메일 프로젝트와 라이브러리를 결합합니다. –

1

생성 된 오브젝트 파일을 연결하는 링커라는 도구가 있습니다. 더 잘 이해하려면 컴파일 프로세스를 찾아야합니다.

(1) 귀하의 library.cpp 파일이 프리 프로세서로 전송 :

+0

그는 "정의가 어디에 있는지", 선언 (프로토 타입)이 아니라고 묻습니다. 링커가 검색을 수행합니다. – dieram3

+0

나는 대답 할 부분에서 마지막 질문을 놓쳤다는 것을 인정합니다. 당신의 대답은 실제로'#include '질문들 중 어느 것에 대해서도 말하지 않습니다. –

-1

코드에 #include "library.h"을 입력하면 컴파일러는 library.cpp도로드하도록 설정되었습니다. 나는 학교에서 컴파일러 명령이나 사용하고있는 시스템에 적합한 makefile (Windows, * nix, MacOS 등)을 사용하여 수동으로 각 파일을 컴파일하고 링크하지 않는 한이 연결을 끊을 방법이 없다는 것을 알게되었습니다. 등)

function prototypes가 저장되어 있기 때문에 library.cpp 파일에 #include "library.h"을 입력해야합니다. 함수 프로토 타입을 "속여"넣을 수 있습니다.cpp 파일을 입력하고 #include "library.cpp"을 입력하면 좋지 않지만 프로그래밍 커뮤니티에서는 일반적으로 권장하지 않습니다.

+0

IDE를 사용하고 있다면,'cpp' 파일을 오브젝트 파일로 컴파일하고 링크 할 수 있습니다. 그렇지 않은 경우 수동으로해야합니다. .cpp 파일을 포함시키는 것은 파일을 한 번만 포함하거나 모든 기능이 인라인으로 표시된 경우에만 작동합니다. 그렇지 않으면 '다중 정의'오류로 인해 링크가 실패합니다. – Bill

+1

'#include "library.h"'*를 쓰는 것은 컴파일러에게'library.cpp'도 컴파일하도록 지시하지 않으며 링커에게 * anything *을 말하지 않습니다. 학교에서 "이 연결을 끊는 것"에 대해 가르쳐 준 것은 경계 가짜입니다. 그리고 Linus Torvalds는'.c' 파일을 포함하는 사람이라면 공개적으로 갈 것입니다. 그건 그렇고, 네가 뭘하고 있었는지 모르겠다. –

+0

나는 결코 그런 말을하지 않았다. 나는'#include "library.h"를 타이핑하면 .cpp 파일을로드하도록 컴파일러에게 알려줄 것이라고 말했다. 그리고 나서 나중에 .h 파일에 프로토 타입이 포함되어 있으며 .cpp 파일에 프로토 타입을 넣어 속임수를 쓸 수는 있지만 그건 잘못된 습관입니다. 내가 거짓이라고 말한 건 아무것도 없었어. 너의 부정적인 태도가 -1 '. 아무도 그 필요가 없습니다. –

관련 문제