2. Core - Assert.

반응형

assert 기능은 프로젝트 진행에 무척 자주 사용하는 기능이다.
그냥 단순히 log 기능이라고 해도 무방할 듯 하다.
assert 기능의 구현은 크게 runtime과 compiletime으로 나뉘며
적당히 사용하면 되는데

매번 바뀌는 변수는 runtime으로 매번 체크

를 하고

한번 체크후 절대 바뀌지 않는것은 compiletime으로 체크

해서
매번 비교하는 부하를 없애주는데 의의가 있다.

이 작업을 하면서 살짝 삽질했던 dll 링크 관련 문제는 아래

링크

를 참조하면 된다.

기존 버전 작업에는 이 assert가 core 외부에 별도의 프로젝트로 했었는데 
이번에 수정하면서 core쪽에 추가해 버렸다. 너무 세세하게 프로젝트를 나누다 보니
프로젝트가 너무 많아지고 그에따라 dll도 많아지고...그냥 그렇다.

소스는 간단하게 핵심 부분만 적어둔다.

1. dll import, export 관련.

#ifdef MGASSERT_EXP_DLL
#define MGASSERT_DLLDECL __declspec(dllexport)
#elif defined MGASSERT_IMP_DLL
#define MGASSERT_DLLDECL __declspec(dllimport)
#else
#define MGASSERT_DLLDECL 
#endif

2. unicode 관련.

namespace std
{
#if defined UNICODE || defined _UNICODE
typedef wstring tstring;
typedef wstringstream tstringstream;
#else
typedef string tstring;
typedef stringstream tstringstream;
#endif
}

3. assert 정의.
template<bool> struct CTAssert;
template<> struct CTAssert<true> {};
#define CT_ASSERT( exp) \
{ \
CTAssert<exp> _COMPILE_TIME_ASSERT_\
CTAssert<exp>* __p_ctassert_instance = &_COMPILE_TIME_ASSERT_; \

위의 CTAssert 템플릿을 보면 자료형이 아닌 bool 상수를 인자로 취하고 있다.
게다가 오직 bool 값이 true일 경우에만 정의되어 있다.
그렇다면 이 템플릿을 인스턴스화 할 때 true값 이외의 값을 넘겨주려 하면
템플릿이 정의되어 있지 않아 컴파일러가 에러를 발생시킨다는 것을 이용한다. 

이외에도 RT assert도 설정 할 수 있다.

그리고 윈도우 프로젝트라면 리소스 파일을 이용해서 dialog를 이용할 수도 있을 것이다.

 

 


DialogBox(instance, MAKEINTRESOURCE(다이얼로그 아이디), wnd, AssertDlgProc);
 
Mgin, ConsoleTester, main.cpp, TestAssert()
 

Reference Links
-

c/c++에서 Compile Time Assertion

http://mtorange.blog.me/120019424125

compile time assertion

-

Windows 동적 라이브러리(DLL)만들기 & 사용하기

-

pre compile header. 미리 컴파일 헤더

-

Unicode 사용하기

-

gpg assert 논의

 

'작업장 > Mgin 제작' 카테고리의 다른 글

5. 프로젝트 설정 - dll  (0) 2014.10.09
3. dx 라이브러리 설정.  (0) 2014.09.22
1. Property Sheet  (0) 2014.09.20
model tool - Lighting.  (0) 2012.01.07
DXUT BackBuffer assert  (0) 2011.07.06
TAGS.

Comments