2009-08-14 102 views
0

我知道,我可以用這個結構檢查德爾福的開關指令的當前狀態:(德爾福)檢查狀態

{$IFOPT R+} 
     Writeln('Compiled with range-checking'); 
{$ENDIF} 

由於我缺乏深入有關Delphi後端編譯器如何工作的資料,我不確定是否有改變函數行爲的方法,這取決於調用它的代碼行中的switch指令的狀態。它看起來是這樣的:

procedure P1; 
begin 
    {$I+} 
    P3; 
    {$I-} 
end; 

// ** state of I unknown 

procedure P2; 
begin 
    {$I-} 
    P3; 
    {$I+} 
end; 

// ** state of I unknown 

procedure P3; 
begin  
    // Something like {$IFOPT I+}, but at the state P3 is called 
    DoThis; 
    {$ELSE} 
    DoThat 
    {$ENDIF} 
end; 

我正在爲遺留代碼編寫適配器,我迫切希望不會被改動。 P3不需要使用指令,但我認爲這是要走的路。

回答

1

更改您的PROGRAMM這樣

procedure P1; 
begin 
    {$I+} 
    P3(true); 
    {$I-} 
end; 

procedure P2; 
begin 
    {$I-}  
    P3(false); 
    {$I+} 
end; 

// ** state of I unknown, but the parameter know the state 

procedure P3(WIthRangeCheck: Boolean); 
begin  
    if WIthRangeCheck then 
     DoThis 
    else 
     DoThat; 
end; 
+0

我想到了,但這正是我想要避免的: -/ – kaeff 2009-08-17 19:59:05

+0

@kaeff也許如果你說出爲什麼要避免這種解決方案,那麼你可以得到另一個。如果您可以更改P3的主體,但不更改參數列表,請使用變量。或者當你不能確保所有的調用者都合作時,你可以引發一個範圍違規並檢查是否拋出異常。 – 2009-08-18 08:02:27

4

不,沒有簡單的方法來做到這一點。編譯器指令的運行級別不同於代碼編譯級別,並且它們不會將有關其狀態的有意義的信息傳遞到代碼中,而且它們當然不適用於他們自己的範圍之外。如果你想將數據傳遞給一個過程,唯一的方法就是使用一個變量,一個參數或一個全局變量。

0

據我所知,編譯器指令只適用於正在編譯的代碼,在這種情況下,「調用方法P3」,而不是方法P3本身的代碼。

如果您要在上面的代碼中使用$ IFOPT I +,那麼P3將被編譯爲$ I +(因爲設置得稍微高於),並且$ IFOPT I +始終爲真。

0

在Delphi XE2,{$ IFOPT I +}工程完全按照你想要的東西:

procedure Test_IO_checkStatus(var isON: Boolean); 
begin 
{Ifopt I+} 
    isON := true 
    {$Else} 
    isON := false; 
    {Endif} 
end; 

調用它,當項目是用{$ I +}編譯並返回TRUE;使用{$ I-}重新編譯它將返回FALSE