我刚开始学习ADA以及gnat是如何工作的,而且在阐述精细代码时我很少理解这些东西.
我已经看到几个例子,其中一个写这样的东西:
E003 : Short_Integer; pragma Import (Ada, E003, "XXX_E"),"XXX"通常是一个包的名称.
我在代码中搜索XXX_E符号但找不到它.因此,我认为这是由gnat以某种方式生成的?!(或者我错了?)我在哪里可以阅读更多相关内容?
谢谢,
我不相信你会找到任何描述为什么GNAT引入这些<pkg>_E符号的文件; 我想开发人员认为你真的不需要知道,而且在使用GNAT的20年中,我不记得曾经有过探索这种情况的必要性.你可以查看源代码(包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;
...
Run Code Online (Sandbox Code Playgroud)
(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;
Run Code Online (Sandbox Code Playgroud)
如果Elaboration.F在详细说明包装体之前要进行调用,则内容Value将不确定.
默认情况下,GNAT会花费相当长的时间来确保不会发生前访问(ABE)(也许这就解释了为什么实际上没有生成签入elaboration.o!)