使用typedef?
时是否可以重命名结构的变量typedef struct {
float x;
float y;
float z;
} Vector;
typedef Vector {
float r;
float g;
float b;
} Color;
答案 0 :(得分:2)
大概你的意思是某种typedef
可以让你说:“颜色与矢量相同,但名称为x
,y
和{{1} }分别更改为z
,r
和g
“?
如果是这样,答案是否定的,C没有提供(我也不能想到它提供的任何合理的替代品)。
编辑:但是,您可以很容易地对任何一个操作:
b
C保证具有相同类型的相同类型的项目的初始序列(在这种情况下是所有这些项目)可以通过任一选择器同等地工作。换句话说,如果您将typedef union {
Color c;
Vector v;
} cv;
int my_func(cv *value);
放入Vector
并将其传递给函数,则该函数可以将这三个项目用作cv
,r
和{ {1}}或g
,b
和x
没有任何问题(例如,如果它写入y
,则会更改z
,如果您将其视为g
而非y
)。
编辑:C99,§6.5.2.3/ 5:
为了简化联合的使用,我们做了一个特别的保证:如果一个联合包含几个共享一个共同初始序列的结构(见下文),并且如果联合对象当前包含这些结构中的一个,则允许检查其中任何一个的共同初始部分,可以看到完整类型的联合声明。如果对应的成员具有一个或多个初始成员的序列的兼容类型(并且对于位字段,具有相同的宽度),则两个结构共享共同的初始序列。
在这种情况下, all Vector
和Color
的成员在相同的顺序中具有相同的类型,因此此规则适用于任一成员的整体。然而,重读一些东西,这只能让你“检查”共同的初始序列,这可能不包括写入它(虽然我发现很难想象如何在不使写作工作的情况下从任何成员的工作中读取孔)。
答案 1 :(得分:1)
不,你不能这样做。您需要声明一个新的结构类型:
typedef struct {
float x;
float y;
float z;
} Vector;
typedef struct {
float r;
float g;
float b;
} Color;
答案 2 :(得分:0)
我认为这不可能......最接近的事情就是制造第二个并将第一个复制到第二个,但C中没有反射(最接近的概念AFAIK)。
编辑 - 您正在谈论重命名结构的成员吗?这些符号在编译期间被映射。你可能可能弄乱了符号表,但我对此表示怀疑,这似乎是一种极大的矫枉过正,更不用说危险了。
答案 3 :(得分:0)
要做的是拥有功能性抽象。
要点:
typedef Vector Color; /* a color is a kind of vector */
float color_red(Color *c)
{
return c->x;
}
在其他地方,您使用color_red(c)而不是c-> x。
我在Lisp编程中一直遇到这个问题。我想要一双东西,最好的工具就是利弊细胞。 cons单元具有称为CAR和CDR的字段。没关系,只需编写一些其他函数,用不同的名称包装它们。 (CAR和CDR也称为FIRST和REST,用于澄清明显的列表用途。)
答案 4 :(得分:0)
正如其他答案所说,不。但我听说C11支持匿名结构,所以好老了
typedef union
{
struct
{
float x, y, z;
};
struct
{
float r, g, b;
};
} Vector;
typedef Vector Color;
也可能。
当然,将x
,y
和z
与r
,g
和b
的使用严重混杂可能会出现未定义行为,但是没有实现,阅读r
无法可靠地将值写入x
。