Enum 값에 해당하는 문자열 출력 질문드립니다. c/c++

idrukawa의 이미지

제목이 이상한데요... 정리가 안되서..ㅎ

enum TEST_ENUM
{
ONE,
TWO,
THREE
};

이렇게 정의된 ENUM이 있다고 가정합니다.

int xxxx( int iEnum )
{
printf( "%s\n", yyyy(iEnum) );
}

이렇게 사용했을 때,
iEnum == 0 이면 ONE을 출력,
iEnum == 1 이면 TWO를 출력,
iEnum == 2 이면 THREE를 출력하고 싶습니다.

이때 적합한 yyyy() 함수가 있는지?
아니면 맨땅에 구현을 해야하는지?
구현을 한다면 enum 선언에서 "ONE", "TWO", "THREE" 은
어떻게 문자열로 받아와야 하는지?( fread()? ) 등에 대한 조언을 듣고 싶습니다.

잘부탁드립니다.

idrukawa의 이미지

답변 감사합니다.
링크1, 2 모두 확인해 보았습니다.
하지만 이미 선언된 ENUM 값들을 별도의 파일에서 다시 일일이 선언해줘야하는 불편함이 있네요...

현재 문자열로 출력하고 싶은 ENUM은 저만 정의하는 것이 아니라 여러 명이 정의해서 사용하고 있습니다.
언제 추가/삭제될지 모르는 일이고 이럴때마다 수작업으로 이런일을 한다는것은 적지않은 노가다네요;;

yhsuk의 이미지

언어의 한계라서 원하시는 방향까지는 힘들지 않나 싶습니다.
코드를 만드는 유틸을 따로 하나 만드셔서 enum 타입에 대한 문자열 선언도 같이 만들어주도록 해서 복사해서 붙여 쓰는 방법은 어떤가요?

Signature :) - "여유를 갖고 행동하되 게을러지지 말자"

익명 사용자의 이미지

// 아래와 같이 namespace 를 이용할 경우 traverse 및 관련 값 관리에 있어서 탁월한 편의성과 확장성을 보여준다.
// ex) for ( unsigned long i = Test::BEGIN ; i < Test::CNT ; ++i ){}
// 출처 나........

namespace Test
{
enum Enum
{
BEGIN = 0,

one = BEGIN,
two,
three,

END = three,
CNT = ENT + 1,
};

const CString STRING[CNT] =
{
_T("one"),
_T("two"),
_T("three"),
};
};

#define IS_VALID_TEST(value) (Test::BEGIN <= value && value <= Test::END)

void PrintTest(int iInput)
{
if ( !IS_VALID_TEST(iInput) )
{
printf("ERROR : Check the input value!");
}

printf("Matching string is %s\n", Test::STRING[iInput]);

return;
}

klara의 이미지

옛날글이라 이미 해결 하셨을런지도 모르겠네요.
한두개의 enum이라면 수작업으로 해도 되는데, 그게 많아지면 별도의 prebuild단계를 두는것도 해결책이 됩니다.
별도의 텍스트 파일에 enum을 적어두고, 그걸 파싱해서 enum과 관련 문자열을 선언한 소스파일/해더파일을 작성해주는 프로그램을 작성하는 겁니다.
그리고 본 프로그램에서는 prebuild단계에서 생성된 소스/해더파일을 가져와서 쓰는 거지요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.