2012-07-09 2 views
11

오늘 처음으로 머리글이 사전 컴파일되어 실행되었습니다. 내 인생을 바꾸기 전에. 내 C++ 코드를 컴파일하는 것이 그렇게 빠를 수는 없다고 생각합니다. 이제는 완전한 이해가됩니다.머리글 파일의 미리 컴파일 된 머리글

어쨌든, 제가 지금까지 읽은 것부터 미리 컴파일 된 헤더 만 소스 파일 (cpp?)에 추가해야합니다.

Visual Studio의 경우 프로젝트 속성 -> C/C++ -> 고급에서 "Include File"옵션이 있습니다. 그 컴파일러 옵션을 stdafx.h으로 설정했습니다.

이 작업을 수행 한 후 더 이상 헤더 파일에 내 stdafx.h에 추가 한 헤더를 포함 할 필요가 없습니다. 소스 파일은 stdafx.h를 자동으로 포함한다고 가정합니다. 이 예상되는 동작입니까?

헤더/소스 파일을 구분할 수없는 곳을 찾을 수 없습니다.

만약 그렇다면 위대한 것들 중 하나 인 VC++는 GCC에서 빠져 나갈 수는 있지만 두려워합니다. 그리고 네. 휴대가 필요합니다. 적어도 GCC와 VC++ 사이.

+1

글쎄, 프로젝트가 gcc에서 작동하도록하려면 "Include File"옵션을 사용하지 않는 것이 좋습니다. Boilerplate는 소스 코드 파일의 첫 번째 #include를 미리 컴파일 된 헤더 파일로 만드는 것입니다. –

+2

@Hans와 동등한 gcc 기능은'-include' 명령 행 옵션을 사용하여 모든 파일의 시작에 * stdafx.h *를 포함시키는 것입니다. –

답변

13

StdAfx.h는 헤더가 아닌 소스 파일에만 포함되어야합니다. 모든 Cpp에서 "StdAfx.h"를 #include하고 "Include File"옵션을 사용하지 말 것을 제안합니다. 그게 내 크로스 플랫폼 프로젝트에서 어떻게하는지. 기록을 위해 GCC에서 실제로 미리 컴파일 된 헤더를 사용하지 않고 그냥 정상적으로 빌드하고 잘 작동합니다.

일부 배경. 컴파일러는 소스 파일 (예 : * .cpp, * .c 등) 만 살펴서 컴파일 할 때 모든 헤더를 포함하고 헤더에있는 모든 코드를 컴파일해야합니다. 미리 컴파일 된 헤더 옵션을 사용하면 모든 코드 (예 : StdAfx.h의 전역 적으로 포함 된 코드)를 한 번 컴파일하여 한 번에 수행 할 필요가 없습니다. StdAfx.cpp가 무엇을위한 것입니다. 컴파일러는 StdAfx.cpp를 StdAfx.h에 포함 된 모든 코드로 컴파일 할 때마다 컴파일하는 대신 한 번 컴파일합니다.

그래서 첫 번째 항목으로 모든 소스 파일에 StdAfx.h를 포함 시키므로 StdAfx.h 이후에 포함되어 액세스 할 수 있으므로 헤더에 포함시키지 마십시오. StdAfx.h에있는 모든 코드. 그런 다음 StdAfx.h가 잘못되었거나 포함되지 않도록 걱정하지 않고도 다른 프로젝트에서 해당 헤더를 사용할 수 있습니다.

+0

제 질문은 VC++가 자동으로 헤더에 이것을 추가 했나요? 내가 포함하지 않은 타입을 사용할 때 에러가 없다. (stdafx.h에있다.) 매우 이상하다. – irwinb

+2

아니요, include include 옵션은 파일을 모든 소스/cpp 파일의 첫 행에 추가합니다. 작업을 포함하는 방법은 포함될 파일의 ​​내용이 #include의 위치에있는 소스 파일에 배치되도록하는 것입니다. 모든 CPP 파일의 상단에 StdAfx.h의 내용이 있고 그 다음에는 헤더 파일과 소스 코드의 내용 (파일의 순서에 관계없이)을 포함하는 강제 포함 옵션이 있습니다. 결과적으로 StdAfx.h에 정의 된 모든 것이 해당 프로젝트 내에서 헤더에서 사용할 수 있습니다. 컴파일러는 헤더가 아닌 소스 파일 만 봅니다. – syplex

+0

아 ~ 알았어. 그건 완벽하게 이해가됩니다. 당신의 설명에 감사드립니다. – irwinb

4

예, 정상적인 동작입니다. 프로젝트 속성 -> C/C++ -> 고급에가 "강제 파일 포함"설정을 제어 Visual C++ compiler option /FI :

이 옵션은 첫번째 상에 #include 지시문에서 더블 인용 부호를 사용하여 파일을 지정하는 것과 같은 효과가 있습니다 every of 소스 파일

이렇게하면 stdafx.h를 수동으로 포함 할 필요가 없습니다.

GCC 및 다른 컴파일러와 함께 미리 컴파일 된 헤더를 사용할 수도 있습니다. Visual C++의 바로 가기 동작은 다른 컴파일러에서 이식 할 수 없습니다. 따라서 휴대용 솔루션에 대한 아이디어가 논의 된 How to handle stdafx.h in cross-platform code?을 확인하십시오.

간단히 말해 .cpp 소스 파일에 stdafx.h를 수동으로 포함하고 GCC (물론 미리 컴파일 된 헤더를 사용하도록 GCC 용 빌드를 구성한다고 가정)를 사용하면됩니다.

+0

.h 및 .cpp 파일에 대한 광고? – irwinb

+0

@irwinb .cpp 파일. 답변도 업데이트되었습니다. – mloskot

+0

.cpp 파일 만 추가하는 경우, VC++ ok를 사용하여 헤더 파일에 이러한 유형의 감속을 포함하지 않은 이유는 무엇입니까? – irwinb

2

"강제로 파일 포함"설정 (/ FI)을 사용하지 마십시오. 편집 & 계속하십시오!

https://connect.microsoft.com/VisualStudio/feedback/details/668339/vs-2010-sp1-c-edit-and-continue-fails-with-fi

및 를 참조 (그리고 MS가이 문제를 해결하고자하지 않는 것) https://connect.microsoft.com/VisualStudio/feedback/details/342441/visual-studio-2005-force-includes-breaks-edit-and-continue-with-pre-compiled-headers

#include "stdafx.h"은 소스 파일의 첫 번째 비 주석 행으로 발견되어야한다, 헤더 파일에는 없습니다.