我有两个ada文件,如下所示
A1.ada
procedure KOR616 is
I : Integer := 3;
procedure Lowest_Level( Int : in out Integer );
pragma Inline( Lowest_Level );
procedure Null_Proc is
begin
null;
end;
procedure Lowest_Level( Int : in out Integer ) is
begin
if Int > 0 then
Int := 7;
Null_Proc;
else
Int := Int + 1;
end if;
end;
begin
while I < 7 loop
Lowest_Level( I );
end loop;
end;
下面显示的是 B1.ada
procedure Lowest_Level( Int : in out Integer );
pragma Inline( Lowest_Level );
procedure Lowest_Level( Int : in out Integer ) is
procedure Null_Proc is
begin
null;
end;
begin
if Int > 0 then
Int := 7;
Null_Proc;
else
Int := Int + 1;
end if;
end Lowest_Level;
with Lowest_Level;
procedure KOR618 is
I : Integer := 3;
begin
while I < 7 loop
Lowest_Level( I );
end loop;
end;
这两个文件有什么区别吗?
答案 0 :(得分:2)
如上所述,KOR616(A1)和KOR618(B1)将具有相同的效果。区别在于可见性(当然,编译的代码会有所不同,但我怀疑这很重要。)
在A1中,Null_Proc和Lowest_Level的主体都可以看到I,但是KOR616之外的任何东西都看不到它们。此外,KOR616的主体可以看到Null_Proc。
在B1中,Lowest_Level(但不是Null_Proc)对整个程序可见,而不仅仅是KOR618。
答案 1 :(得分:1)
在B1中,Null_Proc没有内联。 (它不在Lowest_Level范围内。)
答案 2 :(得分:1)
在A1
中,procedure Null_Proc
不是嵌套在procedure Lowest_Level
中;在B1
中, 嵌套在procedure Lowest_Level
中。关于pragma Inline
,“实施可以自由遵循或忽略pragma所表达的建议。”我希望嵌套子程序的内嵌依赖于实现。
答案 3 :(得分:1)
嗯,主要区别在于,在Null_Proc
之外的第二个示例中Lowest_Level
不可用。在第一个示例中,如果您以后可以使用KOR618
或之后添加的任何其他例程,也可以调用Null_Proc
。
通常我不会在其他例程中定义例程,除非有一些理由说明内部例程在外部例程之外没有意义。显而易见的例子是,如果内部例程对外部例程中声明的局部变量进行操作(不将它们作为参数传递)。
在这种情况下,Null_Proc就像它所获得的一般操作一样,所以我没有看到任何令人信服的理由在Lowest_Level
内部查询它。当然,它根本不做任何事情,所以我没有任何令人信服的理由让它首先存在。 : - )