所以我对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}
};
之后我可以使用枚举来执行坐标转换
如果您了解我想要实现的目标,请解释为什么这不起作用和/或正确的方法是什么?
答案 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]