我刚开始学习ADA以及gnat是如何工作的,而且在制作代码方面我很少理解。
我已经看到几个例子,其中一个写这样的东西:
E003 : Short_Integer; pragma Import (Ada, E003, "XXX_E")
,其中"XXX"
通常是包的名称。
我在代码中搜索XXX_E
符号,但无法找到它。因此,我认为这是由gnat以某种方式生成的?! (或者我错了?)我在哪里可以阅读更多相关信息?
谢谢,
答案 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
实际上没有生成检查!)