C11 添加了“匿名结构和 union ”等功能。
我四处寻找,但找不到关于匿名结构和 union 何时有用的明确解释。我问是因为我不完全明白它们是什么。我知道它们是后来没有名称的结构或 union ,但我一直(不得不?)将其视为错误,因此我只能设想命名结构的用途。
最佳答案
结构内部的匿名 union 在实践中非常有用。考虑到您想要实现一个可区分的和类型(或 tagged union),一个带有 bool 值和 float 或 char*
(即字符串)的聚合,具体取决于 bool 标志。使用 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,您必须为 union 命名,并编写代码 ch->u.f
和 ch->u.s
,后者可读性较差且更冗长。
另一种实现方式 tagged union类型是使用强制转换。 Ocaml runtime举了很多例子。
SBCL Common Lisp 的实现确实使用了一些 union
来实现 tagged union类型。和 GNU make也使用它们。
关于c - 什么时候匿名结构和 union 在 C11 中有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8932707/