`::` 的合法和非法使用
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
前面时,解析器知道它必须是一个类型,没有其他有效的选择。
我研究了这样的代码。例如:
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
前面时,解析器知道它必须是一个类型,没有其他有效的选择。