ada阐述代码_E名称

时间:2018-01-12 15:06:03

标签: ada

我刚开始学习ADA以及gnat是如何工作的,而且在制作代码方面我很少理解。

我已经看到几个例子,其中一个写这样的东西: E003 : Short_Integer; pragma Import (Ada, E003, "XXX_E"),其中"XXX"通常是包的名称。

我在代码中搜索XXX_E符号,但无法找到它。因此,我认为这是由gnat以某种方式生成的?! (或者我错了?)我在哪里可以阅读更多相关信息?

谢谢,

1 个答案:

答案 0 :(得分:5)

我不相信你会找到任何描述GNAT为什么会引入这些<pkg>_E符号的文件;我想开发人员认为你真的不需要知道,而且在使用GNAT的20年中,我不记得曾经有过探索这种情况的必要性。您可以查看源代码(package Sem_Elab看起来有详细信息)。

至于为什么他们在那里,看起来好像是检查一个包已经详细说明;查看绑定器生成的包体(b__<main>.adb,或有时b~<main>.adb),其代码如

...
E056 : Short_Integer; pragma Import (Ada, E056, "ada__text_io_E");
...
   Ada.Text_Io'Elab_Spec;
   Ada.Text_Io'Elab_Body;
   E056 := E056 + 1;
...

E056是地址ada__text_io_E处的双字节对象的本地名称),这意味着“首先,详细说明Ada.Text_IO的规范,然后是它的正文,然后设置一个标志来表明它已被完全阐述了“。

我无法找到实际检查此标志的示例,但您可以看到为什么可能需要它:

package Elaboration is
   function F return Integer;
end Elaboration;

package body Elaboration is
   Value : Integer;
   function F return Integer is (Value);
begin
   Value := 42;
end Elaboration;

如果在详细说明包体之前要调用Elaboration.F,则Value的内容将是未定义的。

默认情况下,GNAT会花费相当长的时间来确保不会发生先前访问(ABE)(也许这就解释了为什么elaboration.o实际上没有生成检查!)