Visual Studio에서“stdafx.h”는 무엇입니까?


500

stdafx.hVisual Studio 2010에서 프로젝트를 시작할 때 이름 이 지정된 파일 이 자동으로 생성됩니다. 크로스 플랫폼 C ++ 라이브러리를 만들어야하므로이 헤더 파일을 사용할 수 없습니다.

무엇을 stdafx.h위해 사용됩니까? 이 헤더 파일 만 제거해도 괜찮습니까?


2
stdafx.h와 관련된 컴파일 오류가 발생하면 일반적으로이 파일을 만들거나 사용하지 않도록 설정합니다.
phoad

6
조 : 초보자를위한 StdAfx.h 함께 - viva64.com/en/b/0265

다른 플랫폼에서 헤더 파일을 잘 사용할 수 있습니다. 일반적인 헤더 파일입니다. 성능상의 이점은 없습니다.
안드레아

답변:


826

모든 C ++ 컴파일러는 처리해야 할 심각한 성능 문제가 있습니다. C ++ 코드 컴파일은 길고 느린 프로세스입니다.

C ++ 파일 위에 포함 된 헤더를 컴파일하는 것은 매우 길고 느린 프로세스입니다. 거대한 헤더 구조를 컴파일하면 윈도우 API와 다른 큰 API 라이브러리의 형태로 부분은 것을 매우 , 매우 길고 느린 과정. 모든 단일 Cpp 소스 파일에 대해 반복해서 수행해야하는 것은 죽음의 곤경입니다.

이것은 Windows 고유의 것이 아니라 Windows와 같은 큰 API에 대해 컴파일해야하는 모든 컴파일러가 직면 한 오래된 문제입니다.

Microsoft 컴파일러는 사전 컴파일 된 헤더 라고하는 간단한 트릭으로이 문제를 개선 할 수 있습니다 . 속임수는 매우 매끄 럽습니다. 비록 모든 CPP 파일이 포함하기 전에 다른 매크로를 #define 한 것과 같은 방식으로 각 Cpp 파일 위에 포함 된 헤더 파일 체인에 대해 잠재적으로 합법적으로 다른 의미를 부여 할 수 있지만 헤더를 다른 순서로 포함시켜), 대부분 그렇지 않습니다. 대부분의 경우 수십 또는 수백 개의 포함 된 파일이 있지만 응용 프로그램에서 컴파일되는 모든 Cpp 파일에 대해 동일한 의미를 갖도록 의도되었습니다.

컴파일러는 모든 Cpp 파일과 매번 처음부터 문자 그대로 수십 개의 포함을 컴파일 할 필요가 없다면 시간을 크게 절약 할 수 있습니다.

트릭은 특수 헤더 파일을 모든 컴파일 체인의 시작점으로 지정하는 것입니다. 이른바 '사전 컴파일 된 헤더'파일은 일반적으로 단순히 역사적인 이유로 stdafx.h 라는 파일 입니다.

stdafx.h 파일에 API에 대한 모든 거대한 거대한 헤더를 적절한 순서로 나열한 다음 #include "stdafx.h"의미있는 내용이 나오기 전에 맨 앞에 CPP 파일을 시작하십시오. 코멘트).

이러한 조건 하에서 컴파일러는 처음부터 시작 하는 대신 이미 저장된 모든 컴파일 결과에서 컴파일을 시작합니다 stdafx.h.

이 트릭이 Microsoft 컴파일러에 고유하다고 믿지 않으며 원래 개발이라고 생각하지 않습니다.

Microsoft 컴파일러의 경우 사전 컴파일 된 헤더 사용을 제어하는 ​​설정은 컴파일러에 대한 명령 행 인수로 제어됩니다 /Yu "stdafx.h". 상상할 수 있듯이 stdafx.h파일 이름 의 사용 은 단순히 관례입니다. 원하는 경우 이름을 변경할 수 있습니다.

Visual Studio 2010에서이 설정은 CPP 프로젝트를 마우스 오른쪽 단추로 클릭하고 '속성'을 선택하고 "구성 속성 \ C / C ++ \ 사전 컴파일 된 헤더"로 이동하여 GUI에서 제어됩니다. 다른 버전의 Visual Studio의 경우 GUI의 위치가 다릅니다.

미리 컴파일 된 헤더를 비활성화 (또는 지원하지 않는 도구를 통해 프로젝트를 실행)해도 프로그램이 불법이되지는 않습니다. 그것은 단지 도구가 매번 처음부터 모든 것을 컴파일한다는 것을 의미합니다.

Windows 종속성이없는 라이브러리를 작성하는 #include경우 stdafx.h파일 에서 주석을 쉽게 주석 처리하거나 제거 할 수 있습니다 . 파일 자체를 제거 할 필요는 없지만 위의 프리 컴파일 헤더 설정을 비활성화하여 명확하게 제거 할 수도 있습니다.


6
std 네임 스페이스의 파일에만 사용하더라도 속도 이점이 있습니다.
Ghita

11
omg, 정말 좋은 답변입니다 .i 표준 호환 c 컴파일러를 찾고있었습니다. 프로젝트 속성에서 micro $ oft 확장을 비활성화하고 컴파일러를 "auto"에서 "c"로 변경하면 거의 "표준"컴파일러 및 IDE를 사용할 수 있습니다.
EKanadily

4
@Rishi : 'line'이란 뜻 #include "stdafx.h"인가요? 물론 이것은 표준 #include에 불과합니다. "MS 확장"부분은 단지 컴파일러 성능 최적화 일뿐입니다. "stdafx.h"라는 헤더 파일을 갖는 의미를 변경하지 않습니다. 포함을 제거하고 코드가 stdafx.h를 통해 포함 된 항목에 종속되는 경우 직접 포함해야합니다.
Euro Micelli

4
@ Youda008, 사실이 아닙니다. 코드 파일을 컴파일하기 전에 헤더의 내용은 #include소스 파일에서 매크로를 평가하는 동일한 '전 처리기'단계에 의해 수행되는 위치에 간단하고 문자 그대로 "붙여 넣기"됩니다 . 결과로 생성 된 총 파일은 실제 컴파일러로 전달되며, 헤더 파일은 별도의 엔티티로 간주되지 않습니다. 헤더 파일에는 선언 만 넣습니다. 헤더 파일에서는 잘 작동하므로 일반적인 규칙입니다. 시도 해봐! 전체 프로그램으로 헤더 파일을 작성한 다음 #include 만있는 소스 파일을 작성하십시오. 잘 컴파일됩니다.
Euro Micelli

28
역사적 호기심. stdafx.h의 이름은 MFC가 출시되기 전에 MFC가 'Application Framework Extensions'라고 불린 1992 년경에 시작되었습니다. Visual Studio 2015의 기본 이름은 여전히 ​​..
kert

48

이 파일은 "사전 컴파일 된 헤더 파일"입니다. stdafx.h에 포함 된 모든 헤더는 사전 컴파일 과정에서 시간을 절약하기 위해 사전 처리됩니다. 자세한 내용 은 MSDN에서 확인할 수 있습니다 .

크로스 플랫폼 응용 프로그램을 작성하는 경우 프로젝트를 만들 때 "빈 프로젝트"를 선택하면 Visual Studio가 프로젝트에 파일을 전혀 넣지 않습니다.


15
이 파일에는 다른 플랫폼에서 작동하지 않는 것이 없습니다. 컴파일러가 사전 컴파일 된 헤더를 지원하지 않으면 컴파일 속도가 느려질 수 있지만 중단해서는 안됩니다. 다른 헤더 파일을 포함하는 헤더 파일 일뿐입니다.
detunized

2
@ detunized : 아마도 내 대답이 다르게 들릴 수도 있으므로 해당 부분을 명확히 해 주셔서 감사합니다.
casablanca

3

"Stdafx.h"는 사전 컴파일 된 헤더입니다. 표준 시스템 포함 파일 및 자주 사용되지만 자주 변경되지 않는 프로젝트 특정 포함 파일 용 파일을 포함합니다. 컴파일 시간과 불필요한 처리가 줄어 듭니다.

사전 컴파일 된 헤더 stdafx.h는 Microsoft Visual Studio에서 기본적으로 사용되어 한 번 컴파일 된 파일을 컴파일러에 알리고 처음부터 컴파일 할 필요가 없습니다. 그것에 대해 더 읽을 수 있습니다

http://www.cplusplus.com/articles/1TUq5Di1/

https://docs.microsoft.com/en-us/cpp/ide/precompiled-header-files?view=vs-2017


-10

나 자신이 뼈대 프레임 워크를 만들려고했지만 Visual Studio 2017에서 새로운 Win32 프로그램 옵션을 만들어 시작한 이후로이 문제에 부딪 쳤습니다. "stdafx.h"는 필요하지 않으므로 제거해야합니다. 그런 다음 솔루션 탐색기에있는 어리석은 "stdafx.h"및 "stdafx.cpp"와 프로젝트의 파일을 제거 할 수 있습니다. 그 자리에 넣어야합니다

#include <Windows.h>

대신에.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.