본문 바로가기

MFC

MFC의 문서화되지 않은 매크로들

 
MFC의 문서화되지 않은 매크로들

  (UNDOCUMENTED MACROs)

                        DEVPIA에서 발췌

  ------------------------------------------------------------------------------------------

  #define DEBUG_ONLY(f)
  _DEBUG일 때는 (f)가 되고 아니면 (0)이 됩니다.

  ------------------------------------------------------------------------------------------

  다음 매크로를 사용해서 포인터를 체크할 수 있습니다.

  #define ASSERT_POINTER(p, type)

  p가 NULL이 아니고 p에서부터 type의 크기(sizeof(type)이겠죠?)만큼의 메모리가 제대로 된 메모리인지 확인합니다.

  #define ASSERT_NULL_OR_POINTER(p, type)

  p가 NULL이거나 p에서부터 type의 크기(sizeof(type)이겠죠?)만큼의 메모리가 제대로 된 메모리인지  확인합니다.
  가끔은 어떤 인자들은 _DEBUG 버전에서만 사용합니다. 릴리즈 버전에서는 경고가 뜰 수 있는데 다음  매크로를 사용해서 경고를 없앨 수 있습니다.

  #define UNUSED_ALWAYS(x)

  이 매크로는 항상 x가 됩니다.

  #define UNUSED(x)

  이 매크로는 _DEBUG일 때는 아무 것도 아닌게 되고 다른 때는 x가 됩니다. _DEBUG일 때만 사용하는 인자에 대해 사용할 수 있습니다.

  MFC의 RUNTIME_CLASS 기능(RTCI)을 이용해서 타입 체크와 안전한 downcast(부모 클래스에서 자식 클래스로 캐스팅)이 가능하게 해주는 매크로 :

  define ASSERT_KINDOF(class_name, object)

  그놈의 오브젝트가 특정 타입인지 확인해줍니다.
  ASSERT_KINDOF(CSubclassWnd, pFound); 이런 식으로 사용합니다.

  #define DYNAMIC_DOWNCAST(class_name, object)

  그 오브젝트가 저 클래스인지 실시간으로 체크합니다. 맞으면 ((class_name*)object)이,
  아니면 NULL이 리턴됩니다. (사실 함수를 호출합니다.)

  #define STATIC_DOWNCAST(class_name, object)

  _DEBUG 버전에서는 pObject가 NULL이거나 class_name이면 제대로 캐스트를 해주지만 아니면 ASSERT로  뻑! 하고 멈춥니다.
  _DEBUG 버전이 아닐 때는 무조건 캐스팅이 됩니다.
  이놈의 매크로들은 C++의 RTTI를 이용하면 사용하지 않을 수 있습니다.
  ps. 이 세 매크로를 제대로 사용하려면 해당클래스에 DECLARE_DYNAMIC 등을 해줘야 합니다.