返回介绍

18.2.2 搜索顺序规则

发布于 2020-09-09 22:55:54 字数 2431 浏览 779 评论 0 收藏 0

对于从一个包中导入的声明,表格18-1为其描述了搜索顺序规则。为了方便以后的讨论,考虑下面的包声明:

package p;
    typedef enum {FALSE, TRUE} BOOL;
    const BOOL c = FALSE;
endpackage

package q;
    const int c = 0;
endpackage

表格18-1:包导入的作用域规则

例子描述包含了一个c的本地声明的作用域没有包含一个c的本地声明的作用域包含了一个使用q::c导入的c声明的作用域包含了一个作为q::*导入的c声明的作用域
u = p::c;
y = p::TRUE;
一个限定的包标识符在任意作用域内可见(无需使用一条导入子句)OK

c的直接引用指向本地声明的c

p::c指向包p中的c
OK

c的直接引用是非法的,因为它是未定义的。

p::c指向包p中的c
OK

c的直接引用指向从q中导入的c

p::c指向包p中的c
OK

c的直接引用指向从q中导入的c

p::c指向包p中的c
import p::*;
. . .
y = FALSE;
包p内的所有声明在导入作用域内都具有潜在的直接可视性:
  • c
  • BOOL
  • FALSE
  • TRUE
OK

c的直接引用指向本地声明的c

对其它标识符(例如FALSE)的引用指向那些隐含地从包p中导入的标识符。
OK

c的直接引用指向从p中导入的c
OK

c的直接引用指向从q中导入的c
OK / ERROR

c在导入作用域内是未定义的。因此对c的直接引用是非法的并且会产生一个错误。

然而允许使用导入子句。
import p::c;
. . .
if(!c) ...
导入的标识符在导入作用域内变为直接可见错误OK

c的直接引用指向从p中导入的c
错误

导入一个在导入作用域中定义的标识符是非法的。
OK / ERROR

p::c的导入使得任何先前对c的引用成为非法的。

然而,对c的直接引用指向从包p中导入的c。

当使用一个通配导入的时候,对一个在包内部声明的未定义标识符的引用会导致这个标识符被导入到本地作用域中。然而,如果相同的标识符在后来又被声明或者被显式地导入的话则会产生一个错误。如下面的例子所示:

module foo;
    import q::*;
    wire a = c;  // 本条语句强制导入q::c;
    import p::c; // q::c和p::c之间的冲突会产生一个错误。
endmodule

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

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

发布评论

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