gpt4 book ai didi

c - C、Pascal 和 SML 中的不相交 union

转载 作者:行者123 更新时间:2023-11-30 14:42:41 25 4
gpt4 key购买 nike

我正在研究编程中的不相交 union 。我发现 PascalSMLC 有自己的 union 版本:variant record,构造 union 。它还说 Pascal 包含一个您不必使用它的“标签”,SML 有一个您需要使用它的标签,而 C 没有标签。此外,如果我们使用错误,SML 会抛出异常,Pascal 允许在运行时检查,而 C 没有在运行时检查的功能,并且程序员必须手动添加“标签”字段。

首先我不明白什么是“标签”。我试图查看这些 union 的一些示例,但不明白“标签”代表什么。如果“标签”很重要,那么 C 怎么会有标签呢?这些 union 之间有什么区别?另外,我没有找到任何与 union “标签”相关的 Material 。另外,“运行时检查”是什么意思,检查什么?很高兴看到展示这些功能的简单示例。

最佳答案

人们可以将这种不相交 union 称为多态性的一种非常早期的形式。一种类型可以有多种形式。在某些语言中,正在使用这些形式中的哪一个(处于事件状态)是通过类型的成员(称为标记)来区分的。这可以是 bool 值、字节、枚举或其他一些序数。

在某些(较旧的?)版本的 Pascal 中,标记实际上需要包含正确的值。 Pascal“union ”(或者在 Pascal 中称为“变体记录”)包含一个值,用于区分哪个分支当前处于“事件”状态。

一个例子:

type
MyUnion = record // Pascal's version of a struct -- or union
case Tag: Byte of // This doesn't have to be called Tag, it can have any name
0: (B0, B1, B2, B3: Byte); // only one of these branches is present
1: (W0, W1: Word); // they overlap each other in memory
2: (L: Longint);
end;

在此类版本的 Pascal 中,如果 Tag 的值为 0,则只能访问 B0、B1、B2 或 B3,而不能访问其他变体。如果Tag为1,则只能访问W0和W1等...

在大多数 Pascal 版本中,没有这样的限制,标签值纯粹是提供信息的。在许多情况下,您甚至不再需要显式标记值:

MyUnion = record
case Byte of // no tag, just a type, to keep the syntax similar
etc...

请注意,Pascal 变体记录不是纯 union ,其中每个部分都是替代项:

type
MyVariantRec = record
First: Integer; // the non-variant part begins here
Second: Double;
case Byte of // only the following part is a "union", the variant part.
0: ( B0, B1, B2, B3: Byte; );
1: ( W0, W1: Word; );
2: ( L: Longint);
end;

在 C 中,您必须在结构中嵌套一个 union 才能获得几乎相同的东西:

// The following is more or less the equivalent of the Pascal record above
struct MyVariantRec
{
int first;
double second;
union
{
struct { unsigned char b0, b1, b2, b3; };
struct { unsigned short w0, w1 };
struct { long l };
};
}

关于c - C、Pascal 和 SML 中的不相交 union ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54355729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com