stdafx.h 란 자주 쓰이는 헤더들 여러 개를 한꺼번에 미리 컴파일 해놓아서 나중에 다시 컴파일하지 않고 그냥 다시 쓰겠다는 헤더이다

이렇게 미리 컴파일된(Precompiled) 파일이 .pch 파일이다

프로젝트의 크기가 커지고 헤더들의 크기가 커지거나 숫자가 많아지면 유용하게 써야할 필요가 있다


프로젝트 속성에서 Precompiled Header의 사용을 Enable 하게 해줘야한다

보통 Wizard로 프로젝트를 생성하는 경우 기본으로 stdafx.hInclude 되어 있는데, 여기서 stdio.hInclude 하면 중복이 되거나 헤더가 엉키는 현상이 발생해서 Unexpected File End 가 발생하게 된다


stdafx.h 를 사용할 때는 모든 cpp 파일이 이를 Include 해야 하며 가능한 깔끔하게 구조를 잡고 가는게 좋다.



'Programming Language > C&C++' 카테고리의 다른 글

[Old] C++Type Casting 정리  (0) 2018.09.25
RAII 의 개념 정리  (0) 2018.08.08


주의) 오래전 Effective C++을 바탕으로 보관한 자료이기 때문에 최신 C++ Trend 가 전혀 반영되어있지 않은 포스팅입니다.


 C++C에서의 Type Casting 보다 확장되고 안정성 있는 Type casting 기법 4가지를 제공한다.


(1) static_cast

 : 크게 implicit castexplicit cast로 나뉜다.



Expressionstatic_cast<type>(expression)으로 표현된다.

 

(2) dynamic_cast

 : 상속 관계를 가로지르거나 하향시킨 클래스(파생 클래스) 타입으로 캐스팅할 때 사용된다. 상속 계층 간에만 사용해야하며 가상 함수가 없는 타입에 적용시킬 수 없고 상수성 제거에도 적용할 수 없다.

dynamic_cast<type>(expression)


-> 일반적으로 사용하는 캐스트는 static_cast이다. 하지만 다형성을 이용하려는 경우에는 얘기가 다르다. 런타임에 다형성을 이용한 모호한 캐스팅이 이루어질 경우 static_cast는 문제가 됨에 반해, dynamic_cast는 실제 Instance를 조사하기 때문에 런타임 오류가 발생하지 않는다. 예를 들어 BC의 부모 클래스일때,



일 때는 다형성의 정의에 의하여 BC의 포인터를 가리킬 수 있으므로 문제가 안되지만,



의 경우에는 BC의 타입으로 변환될 경우에 문제가 생기게 된다

그런데 static_cast로는 타입체크를 하지 않기 때문에 변환되서 문제가 되는 값이 넘어가게 된다. 반면에 dynamic_cast로 변환시에는 NULL값으로 변환된다.

 

(3) reinterpret_cast

 : 연관성이 없는 포인터 타입을 변환하기 위해서 사용된다. 예를 들어


이 경우 위와 같이 static_cast로 변환을 시도하는 경우, 문법적으로 불가능하지만, reinterpret_cast를 이용하면 연관성 없는 두 포인터간 캐스팅이 가능하다

하지만 논리적으로 불안정하며 포인터에 대한 캐스팅만 수행이 가능하고 const 타입에 대한 캐스팅이 안된다.

 

(4) const_cast

 : 포인터 타입과 참조형에 대해서만 사용되는 캐스팅이며 동일 타입 내에서만 사용이 가능하다

그 외에는 is a 관계를 포함한 어떤 관계를 맺고 있더라도 불가능하다. 일반적으로 상수목적으로 지정된 객체 등에 대해서 변수목적으로 사용하고자 할 때 이용한다

또한 volitile 타입 한정자를 지닌 volatile 타입 객체를 참조형으로 변환하고자 할 때도 사용된다. Effective C++에서 이에 대해서 많이 다루고 있으니 참조하자.

 

'Programming Language > C&C++' 카테고리의 다른 글

Stdafx.h 란?  (0) 2018.09.25
RAII 의 개념 정리  (0) 2018.08.08



RAII는 C++ 진영에서 자주 쓰이는 Idiom으로 자원의 안전한 사용을 위해서 객체가 쓰이는 Scope를 벗어나면 자원을 해제해주는 기법이다. 메모리 누수를 관리하는 효과적인 기법이며, 제대로만 사용하면 오히려 별도의 관리 모듈이 붙는 것보다 안정적이다.


이는 C++ 에서 자원을 얻을 때 초기화가 되어야 하며, 유효한 객체 형태가 반환되어야하는 것을 의미한다. 반대로 객체가 사라질 때에는 가진 자원을 전부 반환해야 하며 객체가 유효하지 않은 형태가 되어야 한다.


 그리고 이것은 C++ 의 메모리 누수를 관리하는 철학이며, 이를 Scope 단위로 관리하고자 한다.


 그렇기 때문에 C/C++ 과 같은 통칭 .NET 등에서 Unmanaged 라 불리는 언어들을 다룰 때에는 메모리를 사용하는 각 변수들의 유효한 Scope 를 정확히 파악하는 것이 아주 중요하다.


 heap의 자원은 명시적 해제 이전에 해제되지 않지만 Stack 변수의 경우 Scope를 벗어나면 Destructor가 호출되는 것을 이용한 것이다.


 Exception 등 Control Flow Breaking 시에도 RAII를 이용하여 자원관리를 할 수 있으며 C++의 제작단계에서 스트로스트룹이 finally를 굳이 고안하지 않은 이유이기도 하다.



물론 이러한 특성들이 많은 개발자들의 C++의 진입 장벽을 높이는데에 포인터와 같이 큰 몫을 차지하고 있기 때문에 C++11 등 모던 C++에서는 여러 가지 장치들을 통해 메모리를 관리해주려는 노력을 하고 있다.


'Programming Language > C&C++' 카테고리의 다른 글

Stdafx.h 란?  (0) 2018.09.25
[Old] C++Type Casting 정리  (0) 2018.09.25

+ Recent posts