2017-08-24 77 views
3

所以我很新的C(和一般節目),我想使用結構作爲值枚舉枚舉與結構作爲值?

typedef struct { 
    int x; 
    int y; 
} point; 

// here's what I'd like to do 
enum directions { 
    UP = point {0, 1}, 
    DOWN = point {0, -1}, 
    LEFT = point {-1, 0}, 
    RIGHT = point {1, 0} 
}; 

這樣以後我可以用枚舉進行座標轉換

如果你明白我想達到的目標,請你解釋爲什麼這不起作用和/或什麼是正確的方法來做到這一點?

回答

6

enum僅用於將「幻數」翻譯成文字和有意義的內容。它們只能用於整數。

你的例子比這更復雜。看起來你真正在尋找的是一個結構體,它包含4個不同的point成員。可能const合格。例如:

typedef struct { 
    int x; 
    int y; 
} point; 

typedef struct { 
    point UP; 
    point DOWN; 
    point LEFT; 
    point RIGHT; 
} directions; 

... 

{ 
    const directions dir = 
    { 
    .UP = (point) {0, 1}, 
    .DOWN = (point) {0, -1}, 
    .LEFT = (point) {-1, 0}, 
    .RIGHT = (point) {1, 0} 
    }; 
    ... 
} 
3

不,枚舉只是整型常量的集合。接近你想要什麼(點類型的常量表達式)的一種方法是用預處理器和複合文字:

#define UP (point){0, 1} 
#define DOWN (point){0, -1} 
#define LEFT (point){-1, 0} 
#define RIGHT (point){1, 0} 

,如果你不鏈接到C的過時版本的一些愚蠢的原因,這隻會工作,因爲複合文字是在C99中添加的。

+0

注意術語「ANSI C」早已過時,有時混淆這些天。 –

+0

@ P.P。 - 這主要是因爲一些人聲稱他們無論如何都不能使用現代C – StoryTeller

+1

理由有時並不愚蠢,人們被編譯器/版本困住,因爲變化可能會影響數百萬人的歡呼;) – P0W

1

enum s是整數,沒有什麼更少的了,通過defintion。

一種可能的方式來實現你可能想可能是什麼:

enum directions { 
    DIR_INVALID = -1 
    DIR_UP, 
    DIR_DOWN, 
    DIR_LEFT, 
    DIR_RIGHT, 
    DIR_MAX 
}; 

typedef struct { 
    int x; 
    int y; 
} point; 

const point directions[DIR_MAX] = { 
    {0, 1}, 
    {0, -1}, 
    {-1, 0}, 
    {1, 0} 
}; 

#define UP directions[DIR_UP] 
#define DOWN directions[DIR_DOWN]  
#define LEFT directions[DIR_LEFT] 
#define RIGHT directions[DIR_RIGHT]