c - 什么时候匿名结构和 union 在 C11 中有用?

标签 c struct c11

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.fch->u.s,后者可读性较差且更冗长。

另一种实现方式 tagged union类型是使用强制转换。 Ocaml runtime举了很多例子。

SBCL Common Lisp 的实现确实使用了一些 union 来实现 tagged union类型。和 GNU make也使用它们。

关于c - 什么时候匿名结构和 union 在 C11 中有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8932707/

相关文章:

go - 如何在使用 gorm 插入时跳过结构中的特定字段

c++ - C++中结构的按位异或

c - 是否将指针转换到 intptr_t,对其进行算术运算,然后转换回已定义的行为?

c - strncpy 添加字符

C 从文本文件创建数组

c++ - .h 文件中的客户端结构与实现结构

C11 混合对变量的原子和非原子访问

c - 为什么在 c99 或 c90 模式中支持 _Generic 关键字?

c - 如何读取文本文件图像并将其保存到数组中?

c - 如何为一个月中的几天提供后缀?