2010-11-29 2 views

답변

43

크기가 크고 복잡하며 컴파일 속도가 느리기 때문에 iostream 헤더 자체를 #include 자체 없이도 iostream 유형의 선언에 의존하는 메소드를 자신의 헤더에서 선언 할 수 있습니다.

// foo.h 
#include <iosfwd> 

void sucker(std::iostream& is); 

 

// foo.cc 
#include <iostream> 

void sucker(std::iostream& is) { 
    is >> somevar; 
} 
+0

당신은 자세히 설명 할 수 있습니까? – wp2

+0

@ wp2 : 형식을 정의하지 않고 선언합니다. 왜 그 안에 직접 들여다 보지 않으시겠습니까? 그것은 아주 작습니다. –

+0

foo.h에서 직접하는 대신 foo.cc에서'#include '의 benifit은 무엇입니까? – wp2

27

언급 @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 행의 코드를 처리해야합니다. 소스 파일에서 관심있는 실제 코드를 컴파일하기 전입니다.

+0

다음 명령의 작동 방식은 입니다. $ echo '#include '| g ++ -E -xC++ - | wc 다음 명령을 실행하려고 시도했지만 어떤 오류가 표시됩니다. $ echo '#include '| g ++ -E -xC++ - | wc 내가 틀렸어? – beparas

8

기본적으로 <iosfwd>을 사용하면 컴파일 타임 종속성을 제거해야하기 때문입니다.

기존의 스트림 헤더 (<iostream> 및 친구들) 대신 <iosfwd>을 사용하므로 전체 스트리밍 콘텐츠의 정의를 포함하지 않아도됩니다. <iosfwd>을 사용하면 모든 스트리밍 콘텐츠에 대해서만 포워드 선언을합니다.내가 particulary 유용이 링크를 발견

는 : 그것은 참조를 전달하는 방법을 http://www.gotw.ca/gotw/007.htm

+2

2 년 전의 답변과 2 년이 넘은 답변보다 더 통찰력이 있습니다. –

+0

필자는 이것이 빌드 최적화에 더 많은 영향을 미쳤다. ''을 컴파일하는 데 걸리는 시간은''보다 훨씬 적다. 아니면 그 응용 프로그램이 당신이 말한 것에 대한 주요 추진력입니까? – Hurkyl