首页 > 解决方案 > 使用“使用”。它不仅仅消除了对前缀的需求吗?

问题描述

以下程序 (main.adb) 将无法编译,并给出错误:

main.adb:10:15: expected private type "ThreadName" defined at config.ads:5
main.adb:10:15: found private type "Ada.Strings.Unbounded.Unbounded_String"
main.adb:11:45: expected private type "Ada.Strings.Unbounded.Unbounded_String"
main.adb:11:45: found private type "ThreadName" defined at config.ads:5

然而,当我添加“使用配置”时 子句并删除配置。main.adb 中 MyName 声明的前缀,它可以干净地编译并正常工作。我已经理解使用“use”子句只是为了让我避免使用名称空间前缀,但它似乎可以做更多的事情。谁能解释一下?

文件 config.ads 包含

with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
package Config is
    type ThreadName is new Unbounded_String;
end Config;

我的 main.adb 包含:

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
with Config;

procedure Main is

    MyName : Config.ThreadName;

begin
    MyName := To_Unbounded_String ("Chris");
    Put_Line ( "The name is: " & To_String (MyName));
end Main;

标签: ada

解决方案


使用还使对包中定义的类型的隐式定义操作可见......在此示例中包括 To_Unbounded_String ,反之亦然。

还有 Use Type 使操作可见,而不会用包中的所有内容污染命名空间;但它只暴露了运算符(+、-、= 等),而

with Config;
use all type Config.Threadname;

将使类型、运算符和其他子程序可见,Config.Threadname而不暴露包中的任何其他内容。


推荐阅读