C++ 코드 작성시 가독성과 흐름처리를 원활하게 하기 위해서 다음과 같이 리턴 처리를 자주하게 된다.
bool LogicProcedure()
{
if( A_Logic )
{
return false;
}
if( B_Logic )
{
return false;
}
return true;
}
위와 같이 중간에 흐름제어를 하기 위해서 try catch를 쓰고 싶어진다.이를 해결하기 위해서 ReturnMacro를 작성하였다.
프로그래머에게 금기시되는 goto 제어문을 define으로 감싸서
1. 코드 가독성
2. 사용자 편의
3. 성능상의 잇점
3가지를 모두 얻을 수 있도록 헤더 파일을 제작하였다.
#pragma once
#include < strsafe.h >
//////////////////////////////////////////////////////////////////////////
// ReturnMacro For Singleton Class
template < typename T >
class CReturnMacroForSingleton
{
public:
static T * InstancePtr()
{
if( ms_Instance == NULL ) ms_Instance = new T;
return ms_Instance;
};
static T & Instance()
{
if( ms_Instance == NULL ) ms_Instance = new T;
return *ms_Instance;
};
static void DestroyInstance()
{
delete ms_Instance;
ms_Instance = NULL;
};
private:
static T * ms_Instance;
};
template< typename T > T* CReturnMacroForSingleton::ms_Instance = 0;
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
class CReturnMacro : public CReturnMacroForSingleton< CReturnMacro >
{
public:
explicit CReturnMacro()
: m_nGetLastLine(0)
{
memset( m_tszFunctionName, 0, sizeof( m_tszFunctionName ) );
};
~CReturnMacro() {};
public:
inline int GetLastLine() { return m_nGetLastLine; }
inline void SetLastLine( int nLine ) { m_nGetLastLine = nLine; }
inline TCHAR* GetFunctionName() { return m_tszFunctionName; }
inline void SetFunctionName( TCHAR* ptszFnName )
{
if( FAILED( StringCchCopy( m_tszFunctionName, _countof( m_tszFunctionName ), ptszFnName ) ) )
{
memset( m_tszFunctionName, 0, sizeof( m_tszFunctionName ) );
}
}
private:
int m_nGetLastLine;
TCHAR m_tszFunctionName[256];
};
#define RETURNMACRO CReturnMacro::Instance()
//////////////////////////////////////////////////////////////////////////
struct RETURN_RESULT
{
int LastLine;
TCHAR* LastFnName;
};
#define RETURN_VOID
//////////////////////////////////////////////////////////////////////////
// RETURN FAIL
#define RETURN_FAIL() \
RETURNMACRO.SetLastLine( __LINE__ ); \
RETURNMACRO.SetFunctionName( _T(__FUNCTION__) ); \
goto RET_FAIL;
#define RETURN_FAIL_BEGIN() \
RET_FAIL: \
RETURN_RESULT Ret_Fail; \
Ret_Fail.LastLine = RETURNMACRO.GetLastLine(); \
Ret_Fail.LastFnName = RETURNMACRO.GetFunctionName();
#define RETURN_FAIL_END( ReturnValue ) \
return ReturnValue;
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// RETURN_SUCCESS
#define RETURN_SUCCESS( ) \
RETURNMACRO.SetLastLine( __LINE__ ); \
RETURNMACRO.SetFunctionName( _T(__FUNCTION__) ); \
goto RET_SUCCESS;
#define RETURN_SUCCESS_BEGIN() \
RET_SUCCESS: \
RETURN_RESULT Ret_Success; \
Ret_Success.LastLine = RETURNMACRO.GetLastLine(); \
Ret_Success.LastFnName = RETURNMACRO.GetFunctionName();
#define RETURN_SUCCESS_END( ReturnValue ) \
return ReturnValue;
////////////////////////////////////////////////////////////////////////// Visual Assist Snippet code
RETURN_SUCCESS(); #pragma region RETURN_MACRO RETURN_FAIL_BEGIN(); // Fail Code. RETURN_FAIL_END( RETURN_VOID ); RETURN_SUCCESS_BEGIN(); // Success Code. RETURN_SUCCESS_END( RETURN_VOID ); #pragma endregion RETURN_MACRO
ReturnMacro.h
덧글을 달아 주세요