2010-06-22 60 views
1

我已經展示了下面這兩個文件有沒有區別?

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; 

下一步兩個ADA文件如下所示是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

重新格式化的代碼;如果不正確請回復。 – trashgod 2010-06-22 16:37:40

回答

1

在B1中,沒有內聯Null_Proc。 (它不在Lowest_Level內)。

+0

@ rursw1 - 我很抱歉,但我沒有得到它。請你解釋一下嗎? – maddy 2010-06-22 09:24:47

+0

我很困惑;在'B1'中,'Null_Proc'似乎嵌套在'Lowest_Level'中。 – trashgod 2010-06-22 18:48:53

+0

好點。在第一個例子中,沒有適用於'Null_Proc'的'pragma inline'。第二,爲了內聯外部例程,邏輯上它也必須內聯內部例程。 – 2010-06-25 05:38:42

1

A1procedure Null_Proc不是嵌套在procedure Lowest_Level;在B1中,其嵌套在procedure Lowest_Level中。關於pragma Inline,「一個實現可以隨意或忽略pragma表達的建議。」我希望嵌套子程序的內聯是依賴於實現的。

+0

這就是爲什麼我從來不用'內聯雜注',除非有**證明**需要它。 「這個代碼必須很快」並不夠好。你的解釋最好是這樣的形式:「沒有內聯,它生成的代碼是X.有了它,它改爲Y」。 – 2010-06-25 05:41:12

2

正如所寫,KOR616(A1)和KOR618(B1)將會有相同的效果。區別在於可見性(當然,編譯後的代碼會有所不同,但我懷疑這一點很重要)。

在A1中,Null_Proc和Lowest_Level的主體都可以看到I,但KOR616外部沒有任何東西可以看到它們。另外,KOR616的主體可以看到Null_Proc。

在B1中,Lowest_Level(但不是Null_Proc)對整個程序是可見的,而不僅僅是KOR618。

1

那麼,主要的區別是,在第二個例子Null_Proc不可用Lowest_Level以外。在第一個例子中,如果您以後覺得可以使用KOR618或以後可能添加的任何其他例程,也可以撥打Null_Proc

通常,我不會像這樣定義其他例程中的例程,除非有某些原因,爲什麼內部例程在外部例程之外沒有任何意義。顯而易見的例子是如果內部例程對外部例程中聲明的局部變量進行操作(不將它們作爲參數傳遞)。

在這種情況下,Null_Proc與一般的操作相同,所以我沒有看到任何令人信服的理由將它squ在Lowest_Level之內。當然,它根本沒有做任何事情,所以我沒有任何令人信服的理由讓它首先存在。 :-)

+1

我希望Maddy已經刪除了Null_Proc中不相關的細節。 – 2010-06-25 08:56:50