我缺少哪些技术原因 e 没有静态字段/方法?
我抬头看了LRM,没有提到这样的事情。有一些解决方法(比如这个:http://www.specman-verification.com/index.php?entry=entry060612-105347),但我发现它并不是一个特别干净的方法,因为它没有很好地封装。
答案 0 :(得分:1)
好问题。应该没有这样的技术原因没有它,并且将静态成员添加到 e 结构可能是个好主意。由于 e 的面向方面的特性,它的语义只需要仔细考虑,这与其他一些具有静态成员的语言无关(例如,一个需要回答的问题)是否可以扩展静态方法,例如,使用is also
或不使用。
但是,它对我来说似乎并不是非常关键,因为静态字段实际上只不过是属于给定struct命名空间的全局字段(或方法,或任何其他类型的struct成员)。因此,即使没有静态成员,一个简单的解决方法是将此成员添加到global
(或sys
),并确保其名称具有前缀,使其明确“归属”到给定的结构。
但有一点很重要,它确实使静态成员不仅仅是global
的成员。在 e 中,与C ++一样,有template
种类型。 template
的静态成员一方面会被给定模板实例类型的所有实例对象共享,但是在另一方面,将为每个模板实例单独存在(每个模板实例都是一个单独的结构)。
不确定上述链接中建议的基于端口的解决方法是否更好。我觉得它太过分了。
答案 1 :(得分:1)
实际上,在我之前的回答中,我错过了一个重点,它确实使静态成员不仅仅是global
的成员。
在 e 中,与C ++一样,有template
种类型。 template
的静态成员一方面会被给定模板实例类型的所有实例对象共享,但是在另一方面,将为每个模板实例单独存在(每个模板实例都是一个单独的结构)。
答案 2 :(得分:1)
顺便说一句,静态结构成员被添加到Specman v15.2中的语言中。它们非常方便,特别是在静态的配置结构中:
extend packet_s {
static max_address : uint = 0x1000;
};
-- Change max_address for all instances
on xxx { packet_s::max_address = 0x2000; };
无法生成静态字段,物理(%)或在子类型中使用。以下是来自teamspecman博客的一些评论:Static members in e
答案 3 :(得分:0)
我认为e还没有静态struct成员的主要原因是你总是拥有全局和sys单例以及特定模块的顶级单元(这意味着更好的封装),其中& #39;静'信息可以放置。除了在定义精确语义方面的一些复杂性之外,没有特殊的技术原因。
作为单元访问的语法糖,你总是可以用非常基本的单字宏包装它 - 它不会完全无缝,因为这个神奇的单词总是需要与原生可见的静态结构成员# 39;我',但仍然很容易使用。