【发布时间】:2013-03-25 21:10:26
【问题描述】:
作为一个例子,让我们假设以下设置:
具有显式标记的标记环境的模块定义 A 定义了 foo 类型。并且具有隐式标记环境的模块 B 导入 foo 并将其分配给 bar。
当使用模块 B 读取流时,我不清楚哪种标记环境有效。模块 B 定义了 bar 的标记环境(隐式)(被导入 foo)还是声明它的模块的标记环境(模块 A 中的 foo 因此显式)有效?
我希望我对这个问题的解释足够好
【问题讨论】:
标签: asn.1
作为一个例子,让我们假设以下设置:
具有显式标记的标记环境的模块定义 A 定义了 foo 类型。并且具有隐式标记环境的模块 B 导入 foo 并将其分配给 bar。
当使用模块 B 读取流时,我不清楚哪种标记环境有效。模块 B 定义了 bar 的标记环境(隐式)(被导入 foo)还是声明它的模块的标记环境(模块 A 中的 foo 因此显式)有效?
我希望我对这个问题的解释足够好
【问题讨论】:
标签: asn.1
首先,导入不是像 C 中的 #include 那样的文本内容。它只是使其他模块中的类型可以访问,而无需使用它们的模块名称来限定它们。
X.680 13.1 Note 4 专门针对您的问题:
模块定义的“TagDefault”值只影响那些 在模块中明确定义的类型。它不影响 导入类型的解释。
但是请注意,如果在模块 B 中(导入了 foo),则编写:
Bar ::= [应用程序 5] Foo
这相当于:
Bar ::= [应用程序 5] 隐式 Foo
因为在定义 TaggedType 的模块 B 中,标记环境是隐式的。
注释的意思是,如果在模块 A 中,您有:
Foo ::= SEQUENCE { x [0] INTEGER }
那么 x 上的标记是一个 EXPLICIT 标记,因为模块 A 中的标记环境是显式的,并且 Foo 将始终以这种方式处理,即使在使用其隐式标记环境导入模块 B 时也是如此。
【讨论】: