什么是C11中有用的匿名结构和联合?

除此之外,C11增加了“匿名结构和联盟”。

我捅了一下,却找不到明确的解释,什么时候匿名结构和联合会是有用的。 我问,因为我不完全明白他们是什么。 我知道他们是结构或工会之后没有名字,但是我一直(不得不把?)视为一个错误,所以我只能设想一个命名结构的用法。

结构内部的匿名联合在实践中非常有用。 考虑你要实现一个区分总和types(或标签联合 ),一个布尔集合,或者一个浮点数或一个char* (即一个string),根据布尔标志。 用C11你应该可以编码

 typedef struct { bool is_float; union { float f; char* s; }; } mychoice_t; double as_float(mychoice_t* ch) { if (ch->is_float) return ch->f; else return atof(ch->s); } 

使用C99,你必须命名联合,代码ch->ufch->us ,这是不太可读和更详细的。

匿名结构和联盟的典型和现实世界的使用是提供数据的替代视图。 例如,在实现3D点types时:

 typedef struct { union{ struct{ double x; double y; double z; }; double raw[3]; }; }vec3d_t; vec3d_t v; vx = 4.0; v.raw[1] = 3.0; // Equivalent to vy = 3.0 vz = 2.0; 

如果你将代码作为一个指向三个双打的3Dvector的代码,这是非常有用的。 而不是做f(&v.x)这是丑陋的,你可以做f(v.raw) ,这使你的意图清晰。

 struct bla { struct { int a; int b; }; int c; }; 

typesstruct bla具有C11匿名结构types的成员。

struct { int a; int b; } struct { int a; int b; }没有标签,对象没有名字:它是一个匿名结构types。

您可以通过这种方式访问​​匿名结构的成员:

 struct bla myobject; myobject.a = 1; // a is a member of the anonymous structure inside struct bla myobject.b = 2; // same for b myobject.c = 3; // c is a member of the structure struct bla 

那么,如果你只在代码中声明一次这个结构体的variables,为什么它需要一个名字?

 struct { int a; struct { int b; int c; } d; } e,f; 

你现在可以写东西像eafdb等。

(我添加了内部结构,因为我认为这是匿名结构最常用的一种)

 struct Lock; int lock(Lock*); ... struct Queue { Lock; char buf[QBUFSIZE]; char *rp; char *wp; } qputc(Queue* q, char c){ lock(q); ... } 

update3 : ken c正在做一段时间 – 例如,编译这个和这个 。