1

我在一些 e 文件中有以下代码:

<'
package my_package;

struct packet {
    foo() is {
        print "Hello";
    };
};

'>

我的顶级文件导入了几个文件,包括这个文件,并且在某些时候它调用了 foo() 方法。

现在,我错误地添加了以下代码:

struct packet {};

在其他文件中(我只是忘记了我已经有一个名为“packet”的结构),它是由 top 在上述文件之前导入的。

奇怪的是,当我尝试加载顶部文件时,我收到了这个错误:

*** Error: 'p' (of type main::packet) does not have 'foo()' method.
                at line 9 in top.e
        p.foo();

但是为什么它没有在定义 foo() 的文件上失败呢?

它有一个数据包的结构声明,但数据包已经(错误地)在早期文件中声明,那么为什么它没有给出重复类型名称错误呢?是否允许有两个同名的结构?

4

2 回答 2

3

实际上,并不是主包优先。但是当在某个文件中使用类型名称时,该文件所属的同一包优先。在这种情况下,top.e 文件可能没有任何“package”语句,因此它也属于 package main。如果 top.e 有“package my_package”,那么其中的“packet”将解析为 my_package::packet(而不是 main::packet),并且不会出现错误。

于 2014-05-15T09:30:05.050 回答
2

您可以为不同的结构使用相同的名称,但它们必须在不同的包中定义。在您的情况下,您首先packetmy_package包中定义。我猜您添加的其他代码位于其他没有该行package my_package;的文件中。这意味着您定义了另一个packetmain包中调用的结构。这实际上意味着您有两种不同的类型:my_package::structmain::struct. 在main::packet您没有定义任何foo()功能(您也可以从错误消息中看到)。正如 Yuti 提到的,在您的 top.e 文件中,您可能没有声明包,因此该main包优先于任何其他包。

作为一个练习,如果您将 top.e 中的代码更改为,my_package::packet而不是简单地packet它会起作用。无论如何,您都可以从错误消息中看到有问题。您知道您的预期my_package::packet,但您正在创建一个main::packet.

查看 Specman e 语言参考,第 28 节,封装结构以获取有关包的更多信息。

于 2014-05-15T09:04:59.710 回答