在导入类型的情况下,有效的标记环境是什么?

时间:2013-03-25 21:10:27

标签: asn.1

作为示例,我们假设以下设置:

具有显式标记标记环境的模块定义A定义了类型foo。具有隐式标记环境的模块B导入foo并将其分配给bar。

使用模块B阅读流时,我不清楚哪个标记环境有效。模块B是否定义了bar的标记环境(隐式)(正在导入foo),或者是模块的标记环境(声明模块A中的foo)是否有效?

我希望我能很好地解释这个问题

1 个答案:

答案 0 :(得分:2)

首先,导入不是像C中的#include这样的文本内容。它只是使其他模块中的类型无法使用模块名称进行限定。

X.680 13.1注4特别提到你的问题:

  

" TagDefault"的价值模块定义仅影响那些   模块中明确定义的类型。它不会影响   对进口类型的解释。

但请注意,如果在模块B中(导入了foo),则写入:

  

Bar :: = [APPLICATION 5] Foo

这相当于:

  

Bar :: = [APPLICATION 5] IMPLICIT Foo

因为在模块B中,正在定义TaggedType,标记环境是隐式的。

注意意味着,如果在模块A中,您有:

  

Foo :: = SEQUENCE {x [0] INTEGER}

然后x上的标记是一个EXPLICIT标记,因为模块A中的标记环境是显式的,并且Foo将始终以这种方式处理,即使在使用其隐式标记环境导入模块B时也是如此。