返回介绍

7.15 标签联合体表达式与成员访问

发布于 2020-09-09 22:55:47 字数 1646 浏览 961 评论 0 收藏 0

expression ::=     // 引用自附录A.8.3
    ...
  | tagged_union_expression

tagged_union_expression ::=
    tagged member_identifier [expression]

语法 7-2 — 标签联合体语法(摘录自附录A)

一个标签联合体表达式(压缩的或非压缩的)可以使用关键字tagged紧跟着一个标签联合体标识符,然后再跟着一个代表对应成员值的表达式来表示。对于void类型的成员,成员值表达式被忽略。

例子:

typedef union tagged {
    void Invalid;
    int Valid;
} VInt;

VInt vi1, vi2;

vi1 = tagged Valid (23+34); // 产生Valid int
vi2 = tagged Invalid;       // 产生一个Invalid值

在下面的标签联合体表达式中,花括号内的表达式是结构体表达式(参见7.14 结构体表达式 )。

typedef union tagged {
    struct {
        bit [4:0] reg1, reg2, regd;
    } Add;
    union tagged {
        bit [9:0] JmpU;
        struct {
            bit [1:0] cc;
            bit [9:0] addr;
        } JmpC;
    } Jmp;
} Instr;

Instr i1, i2;

// 产生具有3个寄存器域的Add指令
i1 = (e
    ? tagged Add {e1, 4, ed}; // 通过位置设置结构体成员
    ? tagged Add {reg2:e2, regd:3, reg1:19}); // 通过名字(顺序无关的)

// 产生一个具有“无条件”子操作码的Jump指令
i1 = tagged Jmp (tagged JmpU 239);

// 产生一个具有“有条件”子操作码的Jump指令
i2 = tagged Jmp (tagged JmpC {2, 83}); // 通过位置设置内层结构体
i2 = tagged Jmp (tagged JmpC {cc:2, addr:83}); // 通过名字设置内层结构体

标签联合体表达式的类型必须能够从它的上下文中获知(例如,使用在为类型已知变量赋值的语句的右侧、具有一个强制类型转换、或者是使用在一个已知类型的另外一个表达式中)。表达式计算成该类型的标签联合体的值。标签联合体表达式可以执行完全静态的类型检查:tagged关键字之后的成员名字必须具有表达式的类型,并且成员表达式必须具有对应的成员类型。

一个未初始化的标签联合体类型的变量应该是未定义的(包括标签位)。标签联合体变量可以使用标签联合体表达式初始化,只要成员值的表达式具有合法的成员类型。

标签联合体的成员可以使用通常的点号来读取或赋值。这样的访问需要完全的类型检查,也就是说,读取或赋值的值必须与当前的标签一致。通常,这要求运行时的检查。试图读取或赋值一个类型与标签不一致的值会导致一个运行时错误。

只要指令变量instr当前具有Add标签,那么下面的例子就是合法的:

x = i1.Add.reg1;
i1.Add = {19, 4, 3};
i1.Add.reg2 = 4;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文