【问题标题】:Is it allowed to have two structs with the same name?是否允许有两个同名的结构?
【发布时间】:2014-05-15 07:58:57
【问题描述】:

我在某个 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() 的文件上失败呢?

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

【问题讨论】:

    标签: specman e


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2016-03-29
        • 1970-01-01
        • 2021-09-14
        • 1970-01-01
        • 1970-01-01
        • 2017-12-15
        • 1970-01-01
        • 2013-01-18
        相关资源
        最近更新 更多