'Tag' of union 和 structure 有什么作用?

What does 'Tag' of union and structure do?

union Data
{
   int i;
   float f;
   char  str[20];
} data;

structure Data
{
   int i;
   float f;
   char  str[20];
} data;

这里,据我所知,"data"是一个标签,它是可选的。它到底是什么?在声明结构体或联合体时添加标签有什么好处

Here, as I know,"data" is a tag and it is optional.

不,这里没有标签。标签指示联合的哪个解释是正确的。例如,如果您的代码分配 data.f 并将数据传递给另一个函数,并且它读取 data.str 那么您的程序将出现严重故障,很可能会导致程序崩溃。联合本身没有给函数足够的信息来知道要使用哪个联合成员。

通过添加标签,您可以指出哪种解释是正确的。例如:

struct TaggedData
{
    int type;
    union Data value;
} taggeddata;

其中 type 是标记,表示联合中存储的值类型。读取 taggeddata 的函数现在可以使用 switch 语句并访问正确的联合成员。

标记数据结构的另一个常用名称是 variant type. Compare to Boost.Variant