2017-02-10 1 views
-3

미리 컴파일 된 헤더의 목적은 이미 컴파일 된 오브젝트 파일을 사용하여 실제 프로젝트에 링크하여 컴파일 프로세스의 속도를 높이는 것이라는 것을 알고 있습니다. 하지만 내가 이해하지 못하는 이유는 Visual Studio에서 명시 적으로 stdafx.h (Project Properities -> C/C++ -> Precompiled Headers -> Precompiled Header)을 사용하도록 명시 적으로 적용해야하는 이유입니다. #include "stdafx.h"으로 충분하지 않은 이유는 무엇입니까?stdafx.h가 VisualStudio에 충분하지 않은 이유는 무엇입니까?

+2

IDE에 PCH 생성 여부를 알려줘야합니다. –

+0

블라인드 다운을하지 마십시오. 감사합니다 –

답변

2

따라서 stdafx.h은 일반 헤더 파일로 간주됩니다. 이름에는 특별한 것이 없습니다. 프리 컴파일 된 헤더를 자동으로 사용하도록 설정되어 있지 않습니다.

stdafx.h은 다른 컴파일러에서 일반 헤더 파일로 볼 수도 있고 MSVC에서 프리 컴파일러 헤더를 사용하지 않을 때 사용할 수도 있습니다.

그것은이다 당신이 당신이 실제로 미리 컴파일 된 헤더를 사용하려는 MSVC 컴파일러에게로되어있다. 그것이 바로 프로젝트 설정을하는 이유입니다. 그리고 미리 컴파일 된 헤더를 활성화 할 때만 stdafx.h이 특별한 역할을 수행하고 컴파일러로부터 특별한 대우를받습니다. 그리고 그것은 반드시 stdafx.h 일 필요는 없습니다. 프로젝트 설정에서 다른 이름을 지정하여이 특수 역할을 다른 머리글에 지정할 수 있습니다.

실제로 Microsoft 특정 라이브러리 또는 프레임 워크와 관련이없는 프로젝트에서 AFX에 대한 참조는 상당히 이상 할 것입니다.

+0

정확한 특별 대우가 컴파일러에서'stdafx.h '를받는 이유에 대해 좀 더 자세히 설명해 주실 수 있습니까? 프로세스를 링크하는 고전적인 컴파일과 다른 점은 무엇입니까? –

+1

@Wakan Tanka : 헤더 사전 컴파일은 "연결"과 아무 관련이 없습니다. 그것은 완전히 다른 과정입니다. 'stdafx.h '가받는 "특별한 대우"는 기본적으로 내용이 미리 컴파일 된 상태에서 한 번만 실행 된 후 미리 컴파일 된 형태로 사용된다는 것입니다. 그게 전부입니다. – AnT

+0

"실제로 미리 컴파일 된 헤더를 사용하도록 MSVC 컴파일러에 알리는 사람입니다." 내가 #include stdafx.h를했을 때 MSVC에 말하지 않았습니까? –

3

#include "stdafx.h" [...]으로 충분하지 않은 이유는 무엇입니까?

이것은 표준 C++ 전처리 기 지시어이기 때문에. * 컴파일러에 관한 한 #include <string>과 다르지 않습니다. 추가의 시멘틱스를 추가 할 필요가있는 경우는, 컴파일러에게 그 클래스에 대해서 통지 할 필요가 있습니다.

Visual Studio에서 미리 컴파일 된 헤더를 구현하는 방법이 혼동스러워 보일 수 있으므로 다음은 문서에 대한 링크입니다 (Creating Precompiled Header Files). *마음 당신


은, 그것은 PCH를 생성하는 데 사용되는 기본 헤더 이름 것보다 다른 이름 "stdafx.h"에 대한 특별한 아무것도 없다.

+0

내 Visual Studio 프로젝트에서 PCH 헤더는'stdafx.h '로 명명되지 않았습니다. PCH 헤더의 이름을 지정하는 CMake 매크로를 사용하지만 .. – drescherjm

+0

미안하지만 따라 가지 않습니다. 부가적인 의미? 컴파일러는'#include "stdafx.h"를 "stdafx.h"의 내용으로 대체합니다. 이 시점에서 나는'stdafx.h '에 선언 된 함수를 호출 할 수 있고 컴파일러는 불평하지 않을 것이다. 컴파일이 끝나면'stdafx.obj' 파일이 내 프로젝트와 연결됩니다. 여기에 명시 적으로 다른 것을 지정할 필요가 없습니다. –

+0

@WakanTanka : ** 표준 ** 의미를 설명했습니다. 부가적인 의미는 컴파일러가'#include' 지시어를 ** 미리 처리 된 ** 및 ** 미리 컴파일 된 ** 버전의 헤더로 대체한다는 것입니다. 게다가 헤더 파일은 컴파일 단위가 아닙니다. * "stdafx.obj"* 파일은 없습니다 (PCH의 경우 "stdafx.cpp"파일도 제공하지 않는 한). .obj 파일은 PCH와는 아무런 관련이 없습니다. – IInspectable

-1

미리 컴파일 된 헤더를 안전하게 사용할 수 있는지 여부는 대답하기 쉽지 않습니다. 헤더가 있다고 가정하십시오.

#ifndef FOO 
void foo(); 
#endif 

이제이 헤더를 사전 컴파일한다고 가정합니다.

다른 소스 파일에서는 머리말을 포함하기 전에 FOO을 정의하는 것을 방해하지 않습니다. 그렇게하면 미리 컴파일 된 헤더를 사용해서는 안되지만 컴파일러가 알 수있는 유일한 방법은 헤더의 어디에서나 사용되는 모든 매크로를 추적하는 것입니다.

많은 작업이 있습니다. GCC는이 작업을 수행하지만 Microsoft는이를 선택하지 않았습니다.

미리 컴파일 된 헤더가 특정 시나리오에서만 허용된다는 점은 훨씬 쉽습니다. 큰 사용 사례가 몇 가지 특정 시나리오에 포함되는 경우 충분합니다.

관련 문제