미리 컴파일 된 헤더의 목적은 이미 컴파일 된 오브젝트 파일을 사용하여 실제 프로젝트에 링크하여 컴파일 프로세스의 속도를 높이는 것이라는 것을 알고 있습니다. 하지만 내가 이해하지 못하는 이유는 Visual Studio에서 명시 적으로 stdafx.h
(Project Properities -> C/C++ -> Precompiled Headers -> Precompiled Header)을 사용하도록 명시 적으로 적용해야하는 이유입니다. #include "stdafx.h"
으로 충분하지 않은 이유는 무엇입니까?stdafx.h가 VisualStudio에 충분하지 않은 이유는 무엇입니까?
답변
따라서 stdafx.h
은 일반 헤더 파일로 간주됩니다. 이름에는 특별한 것이 없습니다. 프리 컴파일 된 헤더를 자동으로 사용하도록 설정되어 있지 않습니다.
stdafx.h
은 다른 컴파일러에서 일반 헤더 파일로 볼 수도 있고 MSVC에서 프리 컴파일러 헤더를 사용하지 않을 때 사용할 수도 있습니다.
그것은이다 당신이 당신이 실제로 미리 컴파일 된 헤더를 사용하려는 MSVC 컴파일러에게로되어있다. 그것이 바로 프로젝트 설정을하는 이유입니다. 그리고 미리 컴파일 된 헤더를 활성화 할 때만 stdafx.h
이 특별한 역할을 수행하고 컴파일러로부터 특별한 대우를받습니다. 그리고 그것은 반드시 stdafx.h
일 필요는 없습니다. 프로젝트 설정에서 다른 이름을 지정하여이 특수 역할을 다른 머리글에 지정할 수 있습니다.
실제로 Microsoft 특정 라이브러리 또는 프레임 워크와 관련이없는 프로젝트에서 AFX에 대한 참조는 상당히 이상 할 것입니다.
정확한 특별 대우가 컴파일러에서'stdafx.h '를받는 이유에 대해 좀 더 자세히 설명해 주실 수 있습니까? 프로세스를 링크하는 고전적인 컴파일과 다른 점은 무엇입니까? –
@Wakan Tanka : 헤더 사전 컴파일은 "연결"과 아무 관련이 없습니다. 그것은 완전히 다른 과정입니다. 'stdafx.h '가받는 "특별한 대우"는 기본적으로 내용이 미리 컴파일 된 상태에서 한 번만 실행 된 후 미리 컴파일 된 형태로 사용된다는 것입니다. 그게 전부입니다. – AnT
"실제로 미리 컴파일 된 헤더를 사용하도록 MSVC 컴파일러에 알리는 사람입니다." 내가 #include stdafx.h를했을 때 MSVC에 말하지 않았습니까? –
#include "stdafx.h"
[...]으로 충분하지 않은 이유는 무엇입니까?
이것은 표준 C++ 전처리 기 지시어이기 때문에. * 컴파일러에 관한 한 #include <string>
과 다르지 않습니다. 추가의 시멘틱스를 추가 할 필요가있는 경우는, 컴파일러에게 그 클래스에 대해서 통지 할 필요가 있습니다.
Visual Studio에서 미리 컴파일 된 헤더를 구현하는 방법이 혼동스러워 보일 수 있으므로 다음은 문서에 대한 링크입니다 (Creating Precompiled Header Files). *마음 당신
은, 그것은 PCH를 생성하는 데 사용되는 기본 헤더 이름 것보다 다른 이름 "stdafx.h"
에 대한 특별한 아무것도 없다.
내 Visual Studio 프로젝트에서 PCH 헤더는'stdafx.h '로 명명되지 않았습니다. PCH 헤더의 이름을 지정하는 CMake 매크로를 사용하지만 .. – drescherjm
미안하지만 따라 가지 않습니다. 부가적인 의미? 컴파일러는'#include "stdafx.h"를 "stdafx.h"의 내용으로 대체합니다. 이 시점에서 나는'stdafx.h '에 선언 된 함수를 호출 할 수 있고 컴파일러는 불평하지 않을 것이다. 컴파일이 끝나면'stdafx.obj' 파일이 내 프로젝트와 연결됩니다. 여기에 명시 적으로 다른 것을 지정할 필요가 없습니다. –
@WakanTanka : ** 표준 ** 의미를 설명했습니다. 부가적인 의미는 컴파일러가'#include' 지시어를 ** 미리 처리 된 ** 및 ** 미리 컴파일 된 ** 버전의 헤더로 대체한다는 것입니다. 게다가 헤더 파일은 컴파일 단위가 아닙니다. * "stdafx.obj"* 파일은 없습니다 (PCH의 경우 "stdafx.cpp"파일도 제공하지 않는 한). .obj 파일은 PCH와는 아무런 관련이 없습니다. – IInspectable
미리 컴파일 된 헤더를 안전하게 사용할 수 있는지 여부는 대답하기 쉽지 않습니다. 헤더가 있다고 가정하십시오.
#ifndef FOO
void foo();
#endif
이제이 헤더를 사전 컴파일한다고 가정합니다.
다른 소스 파일에서는 머리말을 포함하기 전에 FOO
을 정의하는 것을 방해하지 않습니다. 그렇게하면 미리 컴파일 된 헤더를 사용해서는 안되지만 컴파일러가 알 수있는 유일한 방법은 헤더의 어디에서나 사용되는 모든 매크로를 추적하는 것입니다.
많은 작업이 있습니다. GCC는이 작업을 수행하지만 Microsoft는이를 선택하지 않았습니다.
미리 컴파일 된 헤더가 특정 시나리오에서만 허용된다는 점은 훨씬 쉽습니다. 큰 사용 사례가 몇 가지 특정 시나리오에 포함되는 경우 충분합니다.
- 1. Java : 인터페이스에서 선언이 충분하지 않은 이유는 무엇입니까?
- 2. distanceTo()가 거리를 계산하기에 충분하지 않은 이유는 무엇입니까?
- 3. 부울 식 (부작용 포함)이 문으로 충분하지 않은 이유는 무엇입니까?
- 4. 잔액이 충분하지 않은 경우
- 5. 계단식 멤버 함수 호출의 경우 참조를 반환해야하는 이유는 무엇입니까? 이 포인터만으로 충분하지 않은 이유는 무엇입니까?
- 6. Popen.communicate()가 충분하지 않은 경우?
- 7. 권한이 충분하지 않은 동기화 엔진
- 8. DateTime.Now가 충분하지 않은 경우 어떻게해야합니까?
- 9. Python 3.2.3이 충분하지 않은 경우
- 10. Elasticsearch CreateIndex() 충분하지 않은 인수
- 11. ode45 충분하지 않은 초기 조건
- 12. 충분하지 않은 입력 인수 - fsolve
- 13. Java JDK 충분하지 않은 공간
- 14. 길이가 충분하지 않은 경우 공백으로 문자열을 채우는 방법은 충분하지 않습니까?
- 15. 확실하지 않은 이유는 무엇입니까?
- 16. sp.core.js가로드되지 않은 이유는 무엇입니까?
- 17. 정의되지 않은 이유는 무엇입니까?
- 18. 안전하지 않은 이유는 무엇입니까?
- 19. json이로드되지 않은 이유는 무엇입니까?
- 20. 공간이 충분하지 않은 경우 boostrap3을 다른 행으로 강제하는 방법은 무엇입니까?
- 21. 사용자가 동전이 충분하지 않은 경우 작업을 차단하는 방법은 무엇입니까?
- 22. 완전한 전문화 과정에서, 상속으로 인해 더 이상 충분하지 않은 정의가없는 전달 선언을 만드는 이유는 무엇입니까?
- 23. prefix =/path/to/perllib가 PERL5LIB를 설정하는 데 충분하지 않은 이유는 무엇입니까?
- 24. 웹 컨트롤에 Windows 응용 프로그램과 같은 이벤트가 충분하지 않은 이유는 무엇입니까?
- 25. MATLAB : "충분하지 않은 입력 인수"오류
- 26. TEXT가 레코드 항목으로 충분하지 않은 경우?
- 27. 하늘색 검색 - 충분하지 않은 파티션 응답 오류
- 28. 비트 수가 충분하지 않은 IP 체크섬
- 29. VisualStudio에 설치하지 않을 때 install.ps1을 실행하십시오.
- 30. VisualStudio에 메서드를 만드는 바로 가기가 있습니까?
IDE에 PCH 생성 여부를 알려줘야합니다. –
블라인드 다운을하지 마십시오. 감사합니다 –