문제

단위 테스트를 작성 해야하는 레거시 코드가 많이 있습니다. 그것은 사전 컴파일 된 헤더를 어디에나 사용하므로 거의 모든 .CPP 파일은 stdafx.h에 종속성을 가지고있어 테스트를 작성하기 위해 종속성을 깨기 어렵게 만듭니다.

첫 번째 본능은 대부분 #include 지시문을 포함하고 필요에 따라 소스 파일에 직접 #includ를 배치하는 모든 stdafx.h 파일을 제거하는 것입니다.

이는 사전 컴파일 된 헤더가 정지하는 위치를 결정하기 위해 stdafx.h와 같은 파일을 갖는 데 의존하기 때문에 사전 컴파일 된 헤더를 끄는 것이 필요합니다.

stdafx.h 종속성없이 사전 컴파일 된 헤더를 유지할 수있는 방법이 있습니까? 이 문제에 접근하는 더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

예, 더 좋은 방법이 있습니다.

사전 컴파일 된 헤더의 '마법사 스타일'을 가진 IMHO 문제는 반복되지 않은 커플 링을 장려하고 재사용 코드를 더 어렵게 만듭니다. 또한 'stdafx.h에 모든 것을 스틱 스팅'으로 작성된 코드는 모든 헤더 파일에서 어떤 것을 변경하는 것으로 유지하기 위해 고통이 발생하기 쉽습니다. 이렇게하면 각 변경 및 재 컴파일 사이클이 예정보다 훨씬 오래 걸리기 때문에 간단한 리팩토링이 영원히 걸릴 수 있습니다.

다시 한 번 더 좋은 방법은 #pragma hdrstop 및 /yc 및 /yu를 사용하는 것입니다. 이를 통해 사전 컴파일 된 헤더를 사용하는 빌드 구성을 쉽게 설정하고 사전 컴파일 된 헤더를 사용하지 않는 구성을 빌드 할 수 있습니다. 사전 컴파일 된 헤더를 사용하는 파일은 소스 파일의 사전 컴파일 된 헤더 자체에 직접 의존하지 않으므로 사전 컴파일 된 헤더가 있거나 없으면 빌드 할 수 있습니다. 프로젝트 파일은 사전 컴파일 된 헤더를 빌드하는 소스 파일과 각 소스 파일의 #pragma hdrstop 라인을 결정합니다. 유지 보수를 수행하면 사전 컴파일 된 헤더를 사용하지 않는 구성과 헤더 파일 변경이 재건 된 후 재 구축 해야하는 코드 만 사용합니다. 전체 빌드를 수행 할 때는 사전 컴파일 된 헤더 구성을 사용하여 컴파일 프로세스 속도를 높일 수 있습니다. 비 컴파일 헤더 빌드 옵션 옵션에 대한 또 다른 좋은 점은 CPP 파일에 필요한 것만 포함하고 필요한 모든 것을 포함시키는 것입니다 (프리 컴파일 된 헤더의 '마법사 스타일'을 사용하는 경우 어려운 것.

나는 이것이 어떻게 작동하는지에 대해 조금 썼습니다. http://www.lenholgate.com/blog/2004/07/fi-stlport-precompiled-headers-warning-4-andpragma-hdrstop.html ( /fi에 대한 것들을 무시하고) #pragma hdrstop 및 /yc /yu 방법으로 구축하는 예제 프로젝트가 있습니다. http://www.lenholgate.com/blog/2008/04/practical-testing-16---fixing-a-mehtout-bug.html .

물론, '마법사 스타일'프리 컴파일 된 헤더 사용에서보다 제어 된 스타일로 얻는 것은 종종 사소한 일입니다 ...

다른 팁

일반적으로 선행 헤더를 사용하면 "stdafx.h"는 두 가지 목적을 제공합니다. 그것은 안정적인 안정, 일반적인 포함 파일 세트를 정의합니다. 또한 각 .CPP 파일에서, 사전 컴파일 된 헤더가 끝나는 곳으로 마커 역할을합니다.

당신이하고 싶은 것은 다음과 같습니다.

  • 프리 컴파일 헤더를 켜십시오.
  • "stdafx.h"를 각 .cpp 파일에 포함시킵니다.
  • "stdafx.h"에서 포함 된 내용을 비우십시오.
  • 각 .CPP 파일에 대해 이전 "stdafx.h"에서 포함 된 포함 된 파일을 알아 내십시오. 각 .cpp 파일에서 #include "stdafx.h"전에 추가하십시오.

이제 최소한의 종속성 세트가 있으며 여전히 선행 헤더를 사용하고 있습니다. 손실은 공통 헤더 세트를 한 번만 소환하지 않는다는 것입니다. 이것은 전체 재건을위한 큰 타격이 될 것입니다. 한 번에 몇 개의 파일 만 다시 컴파일하는 개발 모드의 경우 적중이 적습니다.

아니요, 아마도있을 것입니다 아니다 더 나은 방법.

그러나 주어진 개별 .CPP 파일의 경우 사전 컴파일 된 헤더가 필요하지 않다고 결정할 수 있습니다. 해당 .CPP 파일의 설정을 수정하고 stdafx.h 라인을 제거 할 수 있습니다.

(그러나 실제로, 나는 사전 컴파일 된 헤더 체계가 당신의 단위 테스트 작성을 어떻게 방해하고 있는지는 안됩니다).

사전 컴파일 된 헤더는이 방법으로 컴파일 된 모든 소스에 포함 된 단일 헤더에 의존합니다. 사전 컴파일 된 헤더를 전혀 사용하지 않도록 단일 소스 (또는 모두)에 대해 지정할 수 있지만 원하는 것은 아닙니다.

과거에는 Borland C ++ 컴파일러가 특정 헤더없이 사전 컴파일을했습니다. 그러나 두 소스 파일에 동일한 헤더가 포함되어 있지만 다른 경우에 주문하다, 그들은 C ++의 헤더 파일의 순서가 중요 할 수 있기 때문에 별도로 컴파일되었습니다 ...

따라서 그것은 사전 컴파일 된 헤더가 동일한 순서로 매우 엄격하게 포함 된 소스를 포함하거나 다른 모든 파일에 단일 포함 파일을 포함한 경우에만 시간을 절약했음을 의미합니다 ... - 친숙한 소리?!?!

예. "stdafx.h/stdafx.pch"이름은 단지 컨벤션입니다. 각 .cpp에 자체 컴파일 된 헤더를 제공 할 수 있습니다. 이것은 작은 스크립트로 .vcproj에서 XML을 편집하기 위해 달성하기가 가장 쉬울 것입니다. 단점 : 당신은 사전 컴파일 된 헤더의 큰 스택으로 끝나고 Tu 's 사이에 공유되지 않습니다.

가능하지만 똑똑합니까? 나는 확실히 말할 수 없다.

내 조언은 - 당신의 빌드를 고통스럽게 느리게 만들고 싶지 않다면 사전 컴파일 된 헤더를 제거하지 마십시오. 기본적으로 여기에는 세 가지 옵션이 있습니다.

  1. 사전 컴파일 된 헤더를 제거하십시오 (권장되지 않음)
  2. 레거시 코드에 대한 별도의 라이브러리를 만듭니다. 그렇게하면 별도로 구축 할 수 있습니다.
  3. 단일 프로젝트 내에서 다수의 사전 컴파일 헤더를 사용하십시오. 솔루션 탐색기에서 개별 C ++ 파일을 선택하고 사용할 미리 감시 된 헤더를 알려줄 수 있습니다. 또한 사전 컴파일 된 헤더를 생성하려면 OtherstDafx.h/CPP를 설정해야합니다.

사전 컴파일 된 헤더는 모든 것이 동일한 물건 세트를 포함한다는 아이디어를 전제로합니다. 미리 컴파일 된 헤더를 사용하려면 이것이 암시하는 종속성을 살아야합니다. 의존성 대 빌드 속도의 상충 관계로 이어집니다. 사전 컴파일 된 헤더를 끄고 합리적인 시간 내에 구축 할 수 있다면 반드시 그렇게하십시오.

고려해야 할 또 다른 점은 라이브러리 당 하나의 PCH를 가질 수 있다는 것입니다. 따라서 코드를 작은 라이브러리로 나누고 각각의 종속성 세트를 가질 수 있습니다.

나는 AFX___ 물건을 포함 해야하는 코드에 미리 컴파일 된 헤더 만 사용합니다. UI 코드는 UI를 처리하고 단위 테스트가있는 함수를 호출합니다 (현재 대부분 앱이 유산으로 인한 것은 아님).

대부분의 코드의 경우 사전 컴파일 된 헤더를 사용하지 않습니다.

G.

프리 컴파일 된 헤더는 프로젝트를 재건 할 때 많은 시간을 절약 할 수 있지만 사전 컴파일 된 헤더가 변경되면 모든 교체가 변경 사항에 영향을 미치는지 여부에 관계없이 헤더에 따라 소스 파일이 다시 컴파일됩니다. 다행스럽게도 사전 컴파일 된 헤더가 익숙합니다 엮다, 아니다 링크; 모든 소스 파일은 다음을 사용할 필요가 없습니다 같은 사전 컴파일 된 헤더.

pch1.h :

#include <bigHeader1.h>
#include ...


pch1.cpp :

#include "pch1.h"


출처 1.cpp :

#include "pch1.h"
[code]


pch2.h :

#include <bigHeader2.h>
#include ...


pch2.cpp :

#include "pch2.h"


source2.cpp

#include "pch2.h"
[code]

고르다 PCH1.CPP, 마우스 오른쪽 버튼으로 클릭, 속성, 구성 속성, C/C ++, 사전 컴파일 된 헤더.
사전 컴파일 된 헤더 : 생성 (/yc)
사전 컴파일 된 헤더 파일 : PCH1.H
프리 컴파일 헤더 출력 파일: $ (intdir) pch1.pch

고르다 출처 1.cpp
사전 컴파일 된 헤더 : 사용 (/yu)
사전 컴파일 된 헤더 파일 : PCH1.H
프리 컴파일 헤더 출력 파일: $ (intdir) pch1.pch (나는 이것이 /yu에게 중요하다고 생각하지 않습니다)

똑같은 일을하십시오 pch2.cpp 그리고 source2.cpp, 설정을 제외하고 헤더 파일 그리고 헤더 출력 파일 에게 pch2.h 그리고 pch2.pch. 그것은 나를 위해 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top