什么是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->uf
和ch->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;
你现在可以写东西像ea
, fdb
等。
(我添加了内部结构,因为我认为这是匿名结构最常用的一种)
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正在做一段时间 – 例如,编译这个和这个 。