enum 값 중 하나를 기본값으로 사용하려고 했다. 그래서 기본 성별을 나타내는 AG_DEFAULT를 기존 enum 중간에 끼워넣었다.
enum ACCOUNT_GENDER
{
AG_MALE = 1, //!< Male
AG_FEMALE = 2, //!< Female
AG_NOTDEFINED = 3, //!< Not Defined
AG_UNKNOWN = 4, //!< Unknown
AG_DEFAULT = AG_FEMALE,
AG_MAX
};
여기서 AG_MAX는 enum의 멤버 중 가장 큰 값을 나타내기 위해 추가했던 값이고, AG_DEFAULT는 AG_MAX 바로 위에 넣었다. 이렇게 코드를 고치고 마무리하려다가 문득 의문이 들었다. AG_DEFAULT 값이 2일 테니, AG_MAX의 값은 전처럼 5일까? 아니면 6일 됐을까? 그것도 아니면 AG_DEFAULT보다 1이 더 큰 3이 됐을까? 나로선 5가 나오길 기대하고 있었기에 검증할 겸 단위 테스트 코드를 짰다.
SUITE(SmartDBTest)
{
TEST(GenderValues)
{
DWORD expectedAgMax = AG_UNKNOWN + 1;
DWORD agMax = static_cast<DWORD>(AG_MAX);
CHECK(agMax == expectedAgMax);
}
}
이 테스트가 성공했으면 굳이 블로그에 포스팅하지 않았을 것이니, 당연히 이 테스트는 실패한다. 디버거로 agMAX와 expectedAgMax 값을 확인해보면 각각 3과 5이다. 아무래도 멤버 값을 지정해주지 않으면 소스 코드 상의 위치에 따라 값이 정해지나 보다. 이런 경우엔 AG_DEFAULT를 AG_FEMALE 바로 아래에 두면 원하는 결과가 나온다.
enum ACCOUNT_GENDER
{
AG_MALE = 1, //!< Male
AG_FEMALE = 2, //!< Female
AG_DEFAULT = AG_FEMALE,
AG_NOTDEFINED = 3, //!< Not Defined
AG_UNKNOWN = 4, //!< Unknown
AG_MAX
};