답변
크기가 크고 복잡하며 컴파일 속도가 느리기 때문에 iostream 헤더 자체를 #include
자체 없이도 iostream 유형의 선언에 의존하는 메소드를 자신의 헤더에서 선언 할 수 있습니다.
// foo.h
#include <iosfwd>
void sucker(std::iostream& is);
// foo.cc
#include <iostream>
void sucker(std::iostream& is) {
is >> somevar;
}
언급 @Marcelo Cantos으로, 그것은 그래서 당신은 전체 정의를 포함하지 않고 iostream 클래스와 함수의 선언을 포함 할 수있다 :
다음은 간단한 예입니다. C 및 C++에서 선언은 "여기에 뭔가 (함수/클래스/등)의 이름이 있습니다.하지만 그 이름 이외에는 더 이상 아무것도 말하지 않겠습니다"라는 문구가 있습니다. 함수의 경우 함수의 이름을 의미하지만 함수의 코드가 포함 된 본문은 의미하지 않습니다. 클래스의 경우 클래스의 이름을 의미하지만 클래스의 멤버 변수 나 메서드는 의미하지 않습니다. 함수 본문, 클래스 멤버 등
은 때때로 당신은, 당신이 '돈 사용-에서하는 함수의 경우 무언가의 선언이 필요합니다
반대로, 정의 전체 정의는 함수를 호출하기 위해 함수의 몸이 어떻게 보이는지 알아야합니다 (템플릿 함수 나 인라인 함수의 경우 제외). 마찬가지로 클래스를 사용하면 포인터 또는 클래스의 인스턴스에 대한 참조를 전달할 때 클래스의 멤버를 알 필요가 없습니다. 그러나 멤버 변수에 액세스하거나 클래스 메서드를 호출해야하는 즉시 전체 정의가 필요합니다.
정의 대신 선언 만 포함하면 컴파일러에서 처리해야하는 총 코드 양이 훨씬 적어 컴파일이 훨씬 더 빨리 진행됩니다.
여기 내 로컬 구현에 포함되어 얼마나 많은 코드, 당신에게 처리되고 얼마나 많은 코드의 아이디어를 제공하려면 :
# The following commands create a source file that includes a single header
# file (on stdout), preprocess it with g++ -E, and then count how many lines
# are in the resulting preprocessed output
$ echo '#include <iosfwd>' | g++ -E -xc++ - | wc
2598 6534 57875
$ echo '#include <iostream>' | g++ -E -xc++ - | wc
25631 59613 631998
<iosfwd>
를 포함하는 파일은 컴파일러의 코드 2598 개 라인을 처리 할 수있다 다양한 헤더 파일을 사용하는 반면, <iostream>
을 포함하는 파일은 25631 행의 코드를 처리해야합니다. 소스 파일에서 관심있는 실제 코드를 컴파일하기 전입니다.
다음 명령의 작동 방식은 입니다. $ echo '#include
기본적으로 <iosfwd>
을 사용하면 컴파일 타임 종속성을 제거해야하기 때문입니다.
기존의 스트림 헤더 (<iostream>
및 친구들) 대신 <iosfwd>
을 사용하므로 전체 스트리밍 콘텐츠의 정의를 포함하지 않아도됩니다. <iosfwd>
을 사용하면 모든 스트리밍 콘텐츠에 대해서만 포워드 선언을합니다.내가 particulary 유용이 링크를 발견
2 년 전의 답변과 2 년이 넘은 답변보다 더 통찰력이 있습니다. –
필자는 이것이 빌드 최적화에 더 많은 영향을 미쳤다. '
- 1. .NET의 배열 헤더 란 무엇입니까
- 2. H264 NAL 헤더 란 무엇입니까?
- 3. C의 "개인 헤더"란 무엇입니까?
- 4. 부스트 : "편의 헤더"란 무엇입니까?
- 5. HTTP 헤더 란 무엇입니까? charset이란 무엇입니까?
- 6. "[CS Format = A]"헤더 란 무엇입니까?
- 7. oradiag_ <user> 폴더 란 무엇입니까?
- 8. 유닉스에서 st_ino 란 무엇입니까?
- 9. <span></span> 요소 란 무엇입니까?
- 10. sqlite 개발 헤더 란 무엇이며 어떻게 설치합니까?
- 11. 스레드 란 무엇입니까 (스레드 란 무엇입니까?)?
- 12. 미리 컴파일 된 헤더
- 13. CGI 란 무엇이며 CGI 스크립트 란 무엇입니까?
- 14. PocoCapsule 현재 상태 란 무엇입니까?
- 15. 개발 프레임 워크 란 무엇입니까? IDE 란 무엇입니까?
- 16. 버퍼 란 무엇입니까? 버퍼링 된 읽기 및 쓰기 란 무엇입니까?
- 17. DataContractTranslator 란 무엇입니까?
- 18. "분리 뮤텍스"란 무엇입니까?
- 19. 프로그래밍 언어 란 무엇입니까?
- 20. CSS - @page 란 무엇입니까?
- 21. Java의 직렬화 란 무엇입니까?
- 22. "기호 경고"란 무엇입니까?
- 23. 그림자 메모리 란 무엇입니까?
- 24. PHPSESSID 란 무엇입니까?
- 25. 정확히 PLINQ 란 무엇입니까?
- 26. ASP.Net MVC 란 무엇입니까?
- 27. 불량 선별기 란 무엇입니까?
- 28. 기능 테스트 란 무엇입니까?
- 29. 끈적 풋터 란 무엇입니까?
- 30. doctrine의 저장소 란 무엇입니까?
당신은 자세히 설명 할 수 있습니까? – wp2
@ wp2 : 형식을 정의하지 않고 선언합니다. 왜 그 안에 직접 들여다 보지 않으시겠습니까? 그것은 아주 작습니다. –
foo.h에서 직접하는 대신 foo.cc에서'#include'의 benifit은 무엇입니까? –
wp2