是否允许有两个具有相同名称的结构?

时间:2014-05-15 07:58:57

标签: specman 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()的文件上失败?

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

2 个答案:

答案 0 :(得分:3)

实际上,并不是主要包装优先。 但是,当某个文件中使用类型名称时,该文件所属的同一个包具有优先权。 在这种情况下,top.e文件可能没有任何&#34;包&#34;声明,所以它也属于包主。 如果top.e有&#34;打包my_package&#34;,那么&#34; packet&#34;在它将解析为my_package :: packet(而不是main :: packet),并且没有错误。

答案 1 :(得分:2)

您可以为不同的结构使用相同的名称,但必须在不同的包中定义它们。在您的情况下,您首先在packet包中定义my_package。我猜测你添加的其他代码是在其他没有行package my_package;的文件中。这意味着您在packet包中定义了另一个名为main的结构。这实际上意味着您有两种不同的类型: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节“封装构造”以获取有关包的更多信息。