2011-09-02 4 views
8

두 개의 소스 (cpp) 파일에 #pragma hdrstop (파일 이름 매개 변수 없음)을 넣는 것이 실제적인 가치 ("무엇하지?")는 무엇입니까?여러 파일에서 #pragma hdrstop 매개 변수를 사용하면 어떻게됩니까?

MSDN docs은 저에게 진흙처럼 (다시 한번) 분명합니다.

편집/참고 : this answer 및 관련 기사에서 권장하는 것처럼 보입니다. 하지만 각 컴파일 단위에 대해 개별 pch 파일이 있어야 어떤 이점이 있는지 이해하지 못합니다.

답변

10

원래 질문에 대한 대답은/Yc 또는/Yu가 설정되지 않은 파일에서 #pragma hdrstop을 사용하는 것이 무시된다는 것입니다. 따라서 미리 컴파일 된 헤더 및 기타 빌드없이 빌드 구성을 설정할 수 있습니다 미리 컴파일 된 헤더를 사용하여 빌드하는 구성을 빌드하고 코드 나 헤더를 변경하지 않아도됩니다.

세부 정보 ...

MSDN의 노트에 따르면 "hdrstop pragma를 사용하면 컴파일 된 상태의 파일 이름과 컴파일 상태가 저장되는 위치를 제어 할 수 있습니다." 그것은 사실입니다. 그러나 그것이 얼마나 유용한 지 정확히 명확하지는 않습니다. ...

간단히 말하면.

  • #pragma hdrstop을/Yc 또는/Yu로 컴파일되지 않은 소스 파일에 두는 것은 전혀 영향을 미치지 않습니다.
  • 파일에/Yu가 설정된 경우 hdrstop은 hdrstop이 나타나는 줄 앞에 모든 것을 버리고 컴파일러에 미리 컴파일 된 헤더를 삽입하도록 컴파일러에 지시합니다.
  • 파일에/Yc가 설정된 경우 hdrstop은 hdrstop이 미리 컴파일 된 헤더로 나타나는 행까지 모든 파일에 대해 컴파일 된 상태를 모두 저장한다는 의미입니다.

트릭은 선택적인 헤더 파일 이름없이/Yc 및/Yu를 사용합니다. 'use'또는 'create'라디오 버튼을 체크하고 '헤더를 통해'입력란을 비워 두거나 프로젝트 파일을 편집하십시오.

그래서 미리 컴파일 된 헤더에 포함하고 포함 파일 목록의 끝에 #pragma hdrstop이있는 헤더를 포함하는 PrecompiledHeader.cpp라는 파일이 하나 있습니다. 이 하나의 파일은/Yc로 컴파일됩니다.

그런 다음 프리 컴파일 된 헤더에있는 포함 파일 다음에 #pragma hdrstop을 사용하여 다른 모든 cpp 파일을 갖게됩니다. 이 파일들은 모두/Yu로 컴파일됩니다.

이렇게하면 단일 pch 파일과이 단일 pch 파일을 사용하는 다른 모든 파일을 빌드하는 PrecompiledHeader.cpp가 생성됩니다.

이렇게하면 파일 중 NONE에 '전역'미리 컴파일 된 헤더 작성 헤더 파일이 포함되어야하므로 stdafx.h 등이 필요하지 않습니다. 즉, 모든 #pragma hdrstop 행이 무시되는 미리 컴파일 된 헤더없이 빌드되는 빌드 구성을 설정할 수 있습니다.

"좋은"이유는 신속하게 (단일 헤더를 변경하고 다시 작성하도록 강요 할 수있는) 단일 "no precomp"빌드 구성과 다른 "정상"구성을 가질 수 있다는 것을 의미하기 때문입니다 DO는 미리 컴파일 된 헤더를 사용합니다.

+0

감사합니다. 고마워요! ... 이제, 흠 ... * "미리 컴파일 된 헤더에있는 포함 파일 다음에 #pragma hdrstop을 사용하여 다른 모든 cpp 파일을 갖게됩니다."* - 이것은 다른 파일이 그 파일의 내용을 알아야한다는 것을 의미합니까? 사전 컴파일 된 헤더를 사용하여 hdrstop 행 전후에 포함을 분할 할 수 있습니까? –

+2

그렇게하면 더 잘 작동합니다. 그러나 당신은 할 필요가 없습니다. 프리 컴파일 된 헤더에없는 #pragma hdrstop 위에있는 파일을 가지고 있다면 precomp 빌드에서 빌드 오류가 발생합니다. 그런 다음 사전 컴파일에 있어야하는지 여부를 널리 알기 위해 널리 사용되는지 여부를 결정할 수 있습니다. –

5

#pragma hdrstop 앞에 오는 코드는 모두 미리 컴파일 된 헤더의 일부입니다.

미리 컴파일 된 헤더 파일의 이름에 따라 결정된다

없음 파일명 파라미터가 주어지지 않으면 the documentation에 언급 된 바와 같이, 헤더의 이름은 .PCH 확장자 소스 파일의 기본 이름 것 다음과 같은 규칙, 우선 순위에 따라 :

  1. 은/FP가 컴파일러 옵션

  2. 파일 이름 인수에 대한 인수는

  3. 을 hdrstop의 #pragma하기

그래서 .PCH 확장자를 가진 소스 파일의 기본 이름, 당신은 (blah.cpp라는 이름의 파일이 /Yc로 컴파일 된 blah.pch라는 이름의 파일 IFF을 생산하는 것입니다 경우있는 경우에만 하나의 파일이 설정되어 있어야합니다).

+0

옵션 0, 1 및 2를 건너 뛸 때 발생하는 문제입니다./Yu는 매우 보편적이며 옵션 0입니다. –

4

C/C++ 프로젝트에서 #pragma hdrstop을 사용하지 않으면 생성 된 .pch의 소스 파일로 전용 .cpp 파일이 있습니다.

.pch 파일을 만들려는 .cpp 파일에서 #pragma hdrstop을 사용하는 경우 .cpp 파일은 #pragma hdrstop 줄 뒤에 다른 유용한 내용을 포함 할 수 있습니다. 처음/cd 컴파일 옵션으로이 .cpp 파일을 컴파일하면 .pch 파일과 .obj 파일이 생성됩니다. .cpp 파일을 변경하고/Yu 컴파일 옵션을 사용하여 다시 컴파일하면 컴파일러에서 #pragma hdrstop 줄의 내용을 .pch 파일로 바꾼 다음 #pragma hdrstop 줄 뒤에 부분을 다시 컴파일하고 컴파일을 저장하면서 새 .obj 파일을 만듭니다 시각. 프로젝트에 단 하나의 소스 파일 만 있으면 매우 유용합니다.

사전 컴파일 헤드 파일을 사용하는 소스 파일의 경우 #pragma hdrstop은 .pch 파일로 대체되어야하는 컴파일러의 랜드 마크이므로/Yu 컴파일 옵션을 사용하여 헤더 파일 이름을 나타내지 않아도됩니다.

+0

감사합니다. 이 대답은 * 다소 의미가 있습니다. 그래서 당신은 다른 컴파일러 스위치로 같은 * cpp 파일을 컴파일해야만 이해할 수 있을까요? –

+0

예. C/C++ 프로젝트는 둘 이상의 .pch 파일을 사용할 수 있습니다./Yu 컴파일 옵션 또는 #pragma hdrstop을 사용하여 모든 소스 파일에 대해 .pch를 지정할 수 있습니다. – ligand

+0

그 정도 이해했습니다. 제가 물어 보려는 의미는 :이 말이 합리적이려면 항상'/ Yu'로 컴파일 된'U.cpp'와 항상'/ Yc'로 컴파일되는 또 다른'C.cpp'가 있어야한다는 것입니다. * 또는 *'/ Yc'와'/ Yu'을 사용하여 한 번 컴파일 된 하나의'UC.cpp'를 가지고 있습니까? –