[C++] ReturnMacro

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
2009/11/21 22:22 2009/11/21 22:22

글 걸기 주소 : 이 글에는 트랙백을 보낼 수 없습니다

덧글을 달아 주세요