作为示例,我们假设以下设置:
具有显式标记标记环境的模块定义A定义了类型foo。具有隐式标记环境的模块B导入foo并将其分配给bar。
使用模块B阅读流时,我不清楚哪个标记环境有效。模块B是否定义了bar的标记环境(隐式)(正在导入foo),或者是模块的标记环境(声明模块A中的foo)是否有效?
我希望我能很好地解释这个问题
答案 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时也是如此。