`::` 的合法和非法使用

Legal and illegal uses of `::`

我研究了这样的代码。例如:

typedef C;
C::T x; //illegal;

typedef C::T c_t; //legal
c_t y;

class C;
   typedef int T;
endclass

为什么第一次使用 :: 非法而第二次合法?

双冒号用于范围解析运算符。它用于访问包内的 classes 和 class.

内的静态数据

您可以在 this reference manual 的第 14 页找到很好的用法示例。

这是 class 范围解析运算符。它用于指定在class范围内定义的标识符。因为 classes 和其他作用域可以具有相同的标识符,所以 class 作用域解析运算符唯一标识特定 class.

的成员、参数或局部参数

更多信息可以在 IEEE 1800-2017 章节中找到。 8.23 Class范围解析运算符。

SystemVerilog 要求必须知道类型标识符是一种类型,然后才能引用该类型。这在 1800-2017 LRM 的第 6.18 节开头进行了解释,此示例来自此。

你声明 x 的问题是 C::T 在那个时候不是已知类型。

当你把 typedef 放在 C::T 前面时,解析器知道它必须是一个类型,没有其他有效的选择。