代码之家  ›  专栏  ›  技术社区  ›  LambdaBeta

Ada精化根本没有发生

  •  0
  • LambdaBeta  · 技术社区  · 5 年前

    问题是,我不“与”有任何疑问的单位,但在理论上,它应该仍然可以访问,只要它的阐述发生。

    我的问题是,在代码中,通过pragmas,在gpr项目文件中,或者通过命令行开关,我是否可以强制编译器包含一个文件,即使它认为该文件没有被引用?

    广告:

    package As is
        type A is tagged null record;
        type Nothing is null record;
        function Create (Ignored : not null access Nothing) return A;
        function Image (From : A) return String;
    end As;
    

    亚洲开发银行:

    package body As is
        function Create (Ignored : not null access Nothing) return A is
            (null record);
        function Image (From : A) return String is ("A");
    end As;
    

    查找器广告:

    with Ada.Tags;
    
    package Finder is
        procedure Register (Name : String; Tag : Ada.Tags.Tag);
        function Find (Name : String; Default : Ada.Tags.Tag) return Ada.Tags.Tag;
    end Finder;
    

    with Ada.Containers.Indefinite_Vectors;
    
    package body Finder is
        type Name_Tag (Size : Natural) is
            record
                Name : String (1 .. Size);
                To : Ada.Tags.Tag;
            end record;
    
        package Name_Tag_Vectors is new Ada.Containers.Indefinite_Vectors (Positive, Name_Tag);
        Name_Tags : Name_Tag_Vectors.Vector := Name_Tag_Vectors.Empty_Vector;
    
        procedure Register (Name : String; Tag : Ada.Tags.Tag) is begin
            Name_Tags.Append ((Name'Length, Name, Tag));
        end Register;
    
        function Find (Name : String; Default : Ada.Tags.Tag) return Ada.Tags.Tag is begin
            for Tag of Name_Tags loop
                if Tag.Name = Name then
                    return Tag.To;
                end if;
            end loop;
    
            return Default;
        end Find;
    end Finder;
    

    广告:

    with As;
    package Bs is
        type B is new As.A with null record;
        function Create (Ignored : not null access As.Nothing) return B;
        function Image (From : B) return String;
    end Bs;
    

    亚洲开发银行:

    with Finder;
    package body Bs is
        function Create (Ignored : not null access As.Nothing) return B is
            (As.Create (Ignored) with null record);
        function Image (From : B) return String is ("B");
    begin
        Finder.Register ("B", B'Tag);
    end Bs;
    

    with As; use As;
    -- with Bs; -- (uncommenting this line solves my problem, but what if I had the rest of the alphabet?)
    with Finder;
    with Ada.Tags.Generic_Dispatching_Constructor;
    with Ada.Text_IO;
    
    procedure Test is
        function Constructor is new Ada.Tags.Generic_Dispatching_Constructor (
            T => A,
            Parameters => Nothing,
            Constructor => Create);
    
        Nada : aliased Nothing := (null record);
        What : A'Class := Constructor (Finder.Find ("B", A'Tag), Nada'Access);
    begin
        Ada.Text_IO.Put_Line (What.Image);
    end Test;
    
    0 回复  |  直到 5 年前
        1
  •  3
  •   Simon Wright    5 年前

    我做了什么(例如。 here pragma Unreferenced 以防止警告)。

    或者,你可以有一个包裹。 Required_Units 带着所有必要的 with 具有 这是主程序的。

        2
  •  6
  •   Keith Thompson    5 年前

    编译器认为您的包 Bs 没有被引用,因为它没有。你没有 with

    一个简单的例子:

    a、 广告

    package A is
        procedure Blah;
    end A;
    

    a、 亚行

    with Ada.Text_IO;
    package body A is
        procedure Blah is begin null; end Blah;
    begin
        Ada.Text_IO.Put_Line("Elaborate A");
    end A;
    

    package B is
        procedure Blah;
    end B;
    

    b、 亚行

    with Ada.Text_IO;
    package body B is
        procedure Blah is begin null; end Blah;
    begin
        Ada.Text_IO.Put_Line("Elaborate B");
    end B;
    

    主要亚洲开发银行

    with Ada.Text_IO;
    with A;
    procedure Main is
    begin
        Ada.Text_IO.Put_Line("Main");
    end Main;
    

    当我跑的时候 main

    Elaborate A
    Main
    

    它不打印 Elaborate B 因为那个包不是程序的一部分;它只是同一目录中的几个源文件。

    显而易见的解决方案是添加 具有

    我不知道是否有不那么明显的解决办法。如果有的话,可能是编译器特定的。但是我不知道为什么编译器会有一个特性,让你把一个未使用的包合并到一个程序中。

        3
  •  0
  •   Zerte    5 年前

    因为包Bs对程序是不可见的,所以类型B也是不可见的。

    所以下一个问题是:如果在任何地方都不使用类型B,为什么需要注册它?

    如果一个Ada编译器确实详细说明了所有与主程序无关但通过源路径可见的单元(包或独立子程序),那么它将变得非常混乱!。。。