枚举结构为值?

时间:2017-08-24 11:09:05

标签: c enums

所以我对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}
}; 

之后我可以使用枚举来执行坐标转换

如果您了解我想要实现的目标,请解释为什么这不起作用和/或正确的方法是什么?

3 个答案:

答案 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}
  };
  ...
}

答案 1 :(得分:3)

不,枚举只是整数常量的集合。一种近似你想要的方法(点类型的常量表达式)是预处理器和复合文字:

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

只有当你因某些愚蠢的原因而没有链接到过时版本的C时,这才有效,因为在C99中添加了复合文字。

答案 2 :(得分:1)

enum是整数,仅限定义。

实现您可能想要的可能性的方法可能是:

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]