enum 에 대해서..

moonzoo의 이미지

여러분들은 enum을 잘 사용하시나여?

예를 들어
1번.
#define A 0
#define B 1
#define C 2

2번.
enum mytype {A,B,C};

1번과 2번중에 어떤 것을 선호하시는지?

전 enum을 잘 안써봤는데.. enum을 쓰시는 분이 있다면

어떤 이유로 사용하시는지 등이 궁금합니다..

또 한가지..
enum mytype {A,B,C}; 과

int A=0; int B=1; int C=2;과의 차이는 있나여?

단지 보기좋게 하기위해선는 아닐텐데..

enum을 사용하는 이유가 궁금하네요..

indizarm의 이미지

저는 2번 enum.

enum은 typecheking해주지 않습니까?
가질 수 있는 값이 '한정'되는 것이 아닌지...

그리고 '보기 좋다' 라는 것이 readability를
의미하는 것이 아닙니까?

단순히 int i; 보다는 int file_size; 와 같은
것이 readability를 높이는 것과 마찬가지일듯.

그리고 비슷한 것끼리 '묶는' 것이 좋아보여서...

-_-; 너저분했습니다만,

1. typechecking
2. readability
3. '묶어주세요' (갑자기 hentai가 연상... -_-;;)

때문에 enum사용합니다.

What a Cool Days!!!

errai의 이미지

이런 이유도 있겠네요.

#define A 0
#define B 1
#define C 2

A가 1이고 B가 2 C가 3으로 바뀌었다고 했을때, define이라면
하나씩 다 바꾸어주어야 겠지요. 하지만 enum 이라면

#define _NUMBER{A=1, B, C}

이렇게만 해주면 됩니다.

yui의 이미지

gdb에서 보여요. :D

eminency의 이미지

자신이 짠 프로그램을 다른 사람이 사용할 경우 함수의 인자로 flag가 들어간다면 enum 타입으로 하고 헤더파일에 정의해 놓으면 사용자가 알아보기도 쉽겠죠.
몽땅 define이면 어떤게 어디에 쓰는 flag인지 어떻게 알겠습니까..-_-;;;

단, open()처럼 |(or)을 사용하는 flag일 경우는 define을 써야겠죠.

노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5

pynoos의 이미지

열거되는 값들을 하나의 타잎으로 묶어주는데에서는, enum이 당연히 선호되겠지요.
하지만 습관상 #define을 쓰는 것이.. 버릇이 돼버립니다.

enum을 사용하면, compiler에게 hint를 주기 때문에 warning 등을 얻어낼 수 있습니다.

대신 -Wall 등으로 경고옵션을 많이 켜야겠지요.

$ cat a.c
#include <stdio.h>

enum X
{
        A,
        B,
        C
};

int main()
{
        enum X a;
        a = A;
        switch(a)
        {
                case A:
                        printf("a");
                        break;
                case B:
                        printf("b");
                        break;
        }
        return 0;
}

$ gcc a.c -o a -Wall
a.c: In function `main':
a.c:22: warning: enumeration value `C' not handled in switch

eminency wrote:
자신이 짠 프로그램을 다른 사람이 사용할 경우 함수의 인자로 flag가 들어간다면 enum 타입으로 하고 헤더파일에 정의해 놓으면 사용자가 알아보기도 쉽겠죠.
몽땅 define이면 어떤게 어디에 쓰는 flag인지 어떻게 알겠습니까..-_-;;;

단, open()처럼 |(or)을 사용하는 flag일 경우는 define을 써야겠죠.

그래서 대개 #define은 prefix를 두어 사용합니다. prefix가 없는 것들은 정말 아주 오래전부터 쓰이던것들이라서 그냥 사용되는것 같습니다.

그리고, flag에서도 enum을 사용하여 bit or 를 할 수 있는걸요 :)

antibug의 이미지

코딩하다보면 똑같은 int라도 서로 구분해야 할 경우가 많습니다. 예들 들면...

int index ;
int buffer[ 1024 ] ;

int GetValue( int index ) ;
int GetIndex( void ) ;

buffer[ GetValue( 0 ) ] = GetIndex() ;

뭐 이런 어거지같은 :) 코드가 있다고 하면 저는 이렇게 자주 씁니다.
typedef enum my_index_t { __INDEX_0__ = 0, } my_index_t ;
typedef enum my_value_t { __VALUE_0__ = 0, } my_value_t ;

my_index_t index ;
my_value_t buffer[ 1024 ] ;

my_value_t GetValue( my_index_t index ) ;
my_index_t GetIndex( void ) ;

buffer[ GetValue(0) ] = GetIndex() ; // 이거 에러납니다.

enum type을 int로 변환하는 경우는 묵시적인 변환이 가능하지만
그렇지 않은 경우는 모두 직접 캐스팅을 해줘야 합니다. 캐스팅을
'나는 내가 뭘하는지 알고 있어'라고 컴파일러에게 알려주는 것이라고
보고, 서로 다른 타입간에 연산이 되는 경우 (예에서는 인덱스용 변수가
값으로 잘못 할당되는 실수)를 막기 위해서 저는 저런식으로 사용합니다.

그런데 값이 int가 아니면 저런게 안되는데 방법이 없일까 생각중입니다.

--------------------------------------
재미없는 일은 하지 말자는 인간 쓰레기.
-.-;

cinsk의 이미지

macro를 사용하더라도 컴파일시 "-g3 -gdwarf-2" option을 사용하시면 gdb에서 macro로도 볼 수 있습니다.

예전에는 enum을 썼을때만 볼 수 있었던 거였지만, 이제는 debugger에서 symbolic name을 볼 수 있는게, enum만의 장점이라 할 수 없겠죠.

shad0wse의 이미지

저 또한 enum을 사용합니다.
사용하는 이유는 윗 분들과 동일하다고 할 수 있습니다.

가독성이 좋습니다. 헤더 파일을 열었을 때.. 딱 알 수 있지요..

하지만 defined 된 값이 일정하지 않으면 enum 보다는 const 나 define이 낫겠지요.

Always as first

Always as first

bushi의 이미지

전 enum 을 사용하지 않습니다.
lxr 이 분석을 하지 못해서요.
http://lxr.linux.no/

OTL

댓글 달기

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