2013-03-27 2 views
1

프리 컴파일 된 헤더를 사용하여 VS2012에서 매우 기본적인 프로젝트를 진행했습니다. stdafx.h에 "common"include를 모두 추가해야하고 각 .cpp 파일에이 파일을 포함시켜야한다는 것을 알고 있습니다. 따라서, 기본 설정은 다음과 같습니다VS2012 프리 컴파일 헤더 : 내 .h 파일이 stdafx.h에 포함 된 것을 어떻게 알 수 있습니까?

Foo.h :

#ifndef FOO_H 
#define FOO_H 

class Foo { 

public: 
    Foo(); 
    ~Foo(); 

    void do(string str); 
}; 
#endif 

foo.c를 :

#include "stdafx.h" 
#include "Foo.h" 

void Foo::do(string str) {} 

에 stdafx.h에서 :

#include <string> 
using namespace std; 

미리 컴파일 된 헤더없이 , string 선언에 대해 알고 있어야하므로 #include <string>을 foo.h에 넣었습니다. 그러나 foo.h가이 설정에서 string을 어떻게 알 수 있습니까? stdafx.h는 .cpp 파일에만 포함됩니다.

참고 : 미리 컴파일 된 헤더를 사용하는 작업 예제가 있습니다. 질문은 이것이 어떻게 작동하는지에 관한 것입니다.

+2

스타일 노트 : 헤더 파일에'using namespace std;'를 두는 것은 실제로 전역 이름 공간을 오염시킵니다. 대신에 명시 적 네임 스페이스 사용하기 (예 :'std :: string' 참조) – Joe

+1

@Joe : 올바르게 이해하는지 확인하기 위해 :'namespace std; 대신에 문자열이 필요할 때마다'std : string'을 사용해야합니까? – mort

답변

2

컴파일러가 헤더를 주 컴파일 단위에 나타나는 순서대로 처리하기 때문입니다. .cpp 파일 ("stdafx.h" 통해 간접적으로) <string> 포함

때문에 <string>의 내용은 컴파일러에 공지되어 있으며, 심지어 코드 헤더 파일에서 가져온 다음 코드에 의해 사용될 수있다.

처음에는 <string>을 포함하지 않고 헤더 파일을 포함하면 오류가 발생하기 때문에 깨지기 쉽습니다.

+0

기술적으로'stdafx.h'는'Foo.h' 앞에 포함되어 있고, 전자는''입니다. – Joe

+0

@Joe : 예, 그게 제가 첫 문장에서 언급 한 것입니다. –

1

미리 컴파일 된 헤더를 헤더 파일의 캐시 종류로 볼 수 있습니다. 컴파일러는 헤더 집합을 처음 발견했을 때 (일반적으로 stdafx.cpp를 컴파일 할 때) 헤더 집합을 분석하고 컴파일 한 다음 결과가 필요한 모듈에 대해 준비합니다.