::NPTEAM:: Network Programer Team

검색 :
RSS 구독 : 글 / 댓글 / 트랙백 / 글+트랙백

[Visual Assist] 정품 구매

올해에도 비주얼 어시스트 1년 연장 라이센스 구매!

앞으로 2010년 1월까지는 마음껏 코딩을.. ㅋㅋㅋ

환율이 높아서 작년보다 비싼 가격에 연장했지만, 하루에 200원 투자하는 효과를 충분히 볼 수 있어서 좋아요.

2009/01/23 05:14 2009/01/23 05:14

맨 위로

온라인 게임 서버 구조 토론회

2009/01/15 14:54, 글쓴이 TTF
온라인 게임 서버 구조 토론회 발표 자료

2009/01/15 14:54 2009/01/15 14:54

맨 위로

[C/C++] enum, 보다 나은 enum


프로그래머라면 누구나 enum값이 4byte 정수 자료형이라는 사실을 알고 있습니다.

switch( xxx ) : xxx 에는 정수 자료형만 올 수 있다는 것도 알고 있습니다.

switch( string )
{
  case "A_Case": ... break;
  case "B_Case": ... break;
}

이런식으로 switch 문에서도 문자열을 받고 싶을때가 많습니다.
혹은 enum 값을 1:1 매칭되는 문자열 값으로 변환하고 싶을때가 많습니다.

우연히 웹 서핑을 하던 중 http://eslife.tistory.com/entry/CC-enum-보다-나은-enum을 읽게 되었고, 약간의 팁을 보강하여 다음과 같이 정리하였습니다.


test.h 헤더 파일에 다음과 같이 작성한다.
namespace nsETREEITEMTYPE
{
  // enum ETREEITEMTYPE의 enum 값을 나열한다.(eTIY_GROUP...)
#undef ENUM_LIST
#define ENUM_LIST(ENUM_VALUES)  \
  ENUM_VALUES(GROUP)      \
  ENUM_VALUES(CONNECTION)  \
  ENUM_VALUES(COUNT)
 
#undef DO_DESCRIPTION
#undef DO_ENUM
#define DO_DESCRIPTION(enumValue) _T(#enumValue),
#define DO_ENUM(enumValue) eTIY_##enumValue,
 
  // enum Type 이름(ETREEITEMTYPE)을 설정한다.
  enum ETREEITEMTYPE
  {
    ENUM_LIST(DO_ENUM)
  };
 
  // enum 배열 이름(ptszETIYDescription)을 설정한다.
  static TCHAR* ptszETIYDescription[] =
  {
    ENUM_LIST(DO_DESCRIPTION)
  };
};

위 문장이 전처리기 지시어로 도배(?)가 되어 있어서 가독성이 매우 떨어집니다.
잘 이해가 안가시는 분들을 위해서 한가지 팁을 알려 드리겠습니다.(전처리기 지시어를 자동 변환하는 방법 입니다.)
"C:\Program Files\Microsoft Visual Studio 8\VC\bin\cl.exe" 를 사용하시면 됩니다.

1. test.h 헤더파일에서 #include 문을 모두 주석처리 합니다.
  (#include 문을 만나면 파일을 포함하려고 시도하다가 찾지 못하면 에러가 발생하고, 전처리기 지시문 변환을 실패합니다.)
2. cmd(console 입력창)에서 다음과 같이 입력합니다.
cl /EP /C test.h > c:\result.txt & notepad c:\result.txt

결과는 다음과 같습니다. 두둥!!
//////////////////////////////////////////////////////////////////////////
// 결과 확인 (#include 문이 들어 있으면 결과가 출력되지 않는다.)
// cl /EP /C test.h > c:\result.txt & notepad c:\result.txt
 
namespace nsETREEITEMTYPE
{
  // enum Type 이름(ETREEITEMTYPE)을 설정한다.
  enum ETREEITEMTYPE
  {
    eTIY_GROUP, eTIY_CONNECTION, eTIY_COUNT,
  };
 
  // enum 배열 이름(ptszETIYDescription)을 설정한다.
  static TCHAR* ptszETIYDescription[] =
  {
    _T("GROUP"), _T("CONNECTION"), _T("COUNT"),
  };
};

전처리기 지시어가 깔끔하게 해석되어 나오는 것을 볼 수 있습니다.

이렇게 작성하면 enum 값을 문자열로 변환하고 싶을때,
TCHAR* pString = nsETREEITEMTYPE::ptszETIYDescription[nsETREEITEMTYPE::eTIY_GROUP];
이렇게 쓰시면,
TCHAR* pString = _T("GROUP");
와 같은 결과를 얻으실 수 있습니다.

장점 1. namespace를 사용해서 인텔리센스를 적극적으로 활용할 수 있다.
장점 2. enum 자료형을 추가하면 그에 맞는 문자열이 등록된다.
         (enum 값만 추가하고 문자열을 등록하지 않는 실수를 막을 수 있다.)
장점 3. 전처리기 지시어를 두려워하지 않아도 된다.(cl 명령어로 손쉽게 해석해서 보시면 됩니다.)
2009/01/07 21:23 2009/01/07 21:23

맨 위로

RainMeter

2009/01/06 11:57, 글쓴이 TTF

2009/01/06 11:57 2009/01/06 11:57

맨 위로