enum의 값들을 스트링으로 보려면?

khiny의 이미지

#include <stdio.h>
 
typedef enum{
	red,
	green,
	black
} color;
 
int main(void) {
	color box = green;
	printf("%d\n",box);
 
	return 0;
}

위의 코드를 컴파일해서 실행해보면 1 이 찍힙니다.
근데 1이 아니라 green이라는 값이 찍히도록 하려면 어찌해야 할까요?

color가 정의된 부분을 통짜로 복사해서 적절한 함수를 하나 만든다면?

void print_color(color input){
	switch(input){
		case red : printf("red"); break;
		case green : printf("green"); break;
		case black : printf("black"); break;
		default : break;
	}
}

이런식으로 말이죠.
근데 여기서는 3개의 값밖에 없지만, 저게 1000이상이 되고
중간에 #ifdef 등의 전처리가 들어간다면 print_color함수만드는 일이
꽤 어려워질것 같습니다.(전처리야 머 그대로 해주면 상관없을듯하지만)

저와같이 이런 비슷한 고민을 해 본 분이 있을것 같은데
다른 좋은 방법이 있는지 궁금합니다.

익명 사용자의 이미지

구글링을 해보니 다음과 같은걸 발견했습니당.
http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht20Ht/c_preprocessor_applications_en

khiny의 이미지

윗분이 찾아낸거 보니깐 괜찮은 아이디어네요.
하지만 제가 가지고 있는 enum은 이미 천개가 넘는 양이라서,
저걸 다시 적용시켜서 변환할 생각을 하니...ㅡ.ㅡ;
코딩량을 최소한으로 변환시킬 방법을 생각해야겠네요.
치환을 잘 이용해서...해야할듯하네요.

khiny의 이미지

typedef enum{
	red,
	green,
	black,
       ...1000여개의 색깔
} color;

이 코드를 이렇게 고치려했습니다.
#include <stdio.h>
 
#define COLOR \
C(RED)\
C(GREEN)\
C(BLUE)\
...1000여개의 색깔
 
#define C(x) x,
enum color { COLOR };
#undef C
 
#define C(x) #x,
const char * const color_name[] = { COLOR };

그런데 중간에 전처리가 또 들어가면 대략 낭패가
#define COLOR \
C(RED)\
#ifdef DDD <-여기서 문제 발생이네요.
C(GREEN)\
#endif
C(BLUE)\
...1000여개의 색깔

함수로 만들어야하는건가요?

thyoo의 이미지

C++이라면
이렇게 할 수도 있읍니다.

std::vector<const char*> color_name;
 
namespace DUMMY____ {
inline int next_index()
{
	static int index = 0;
	return index++;
}
struct color__ {
	color__(const char* cn)
	{
		color_name.push_back(cn);
	}
};
}
 
 
#define COLOR( x ) \
const int x = DUMMY____::next_index(); \
namespace DUMMY____ { color__ DUMMY##x(#x); }
 
COLOR( red )
COLOR( green )
// ...
 
int main()
{
	cout << red  << color_name[red] << endl;
	cout << green << color_name[green] << endl;
	return 0;
}

생각해보니까
이대로라면 헤더에 넣고 쓰기에는 부적절하군요...
___________________________________
Less is More (Robert Browning)

___________________________________
Less is More (Robert Browning)

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.