2012-07-25 69 views
2

這是一個後續問題,與我在另一個問題上看到的答案有關,這個問題是我在閱讀stackoverflow時看到的。如果我希望禁用特定函數的溢出檢查(根據this question),這個代碼是否會導致在運行該函數後突然啓用溢出檢查,即使它以前沒有在編譯器選項或代碼中啓用?禁用Delphi中的溢出檢查

{$OVERFLOWCHECKS OFF} 
// function here 
{$OVERFLOWCHECKS ON} 

我需要這與IFOPT塊結合(類似於this例子吧?)返回溢出檢查到以前的狀態(以便不小心使溢出的非調試檢查版本) ?或者兩者不同,這就足夠了?獎勵:如果我確實需要IFOPT,那麼特定的語法將有條件地禁用溢出檢查?

+0

我個人認爲代碼溢出檢查具體應該單元測試,並在單元的頂部{$ OVERFLOWCHECKS開/關}硬編碼,明確覆蓋項目設置,然後寫並測試您的代碼,以便沒有項目設置會打破您的單位。 – 2012-07-26 20:04:12

回答

13

是的,您發佈的代碼段將自動啓用溢出檢查,無論以前是什麼。

這應該工作。如果您願意,您可以分別用{$OVERFLOWCHECKS ON}{$OVERFLOWCHECKS OFF}替換{$Q+}{$Q-}

{$IFOPT Q+} 
    {$DEFINE OVERFLOW_ON} 
    {$Q-} 
{$ELSE} 
    {$UNDEF OVERFLOW_ON} 
{$ENDIF} 
// 
// Your code here 
// 
{$IFDEF OVERFLOW_ON} 
    {$Q+} 
    {$UNDEF OVERFLOW_ON} 
{$ENDIF} 
+0

這看起來太複雜了,因爲$ Q的範圍是本地的,它看起來像不是太大的單位,如果只是禁用/啓用指令,你會好的,除非你正在處理一個真正複雜的項目球隊。 – jachguate 2012-07-26 10:26:38

+0

@jachguate,不,它不是。將其關閉然後再影響其間的代碼,但如果將其保留在上面,則會一直保持,直到其他位置發生更改爲止。如果你以後沒有在其他地方特意關閉它,它會影響編譯的所有內容(至少在該單元中,可能更多)。嘗試一下。就複雜而言,您可以輕鬆構建一個代碼模板,通過幾個按鍵和一個Ctrl + J(或者選項卡或空間,如果以這種方式設置模板)完成所有這些操作。 – 2012-07-26 10:57:03

+0

上述技術可行,但我不推薦給OP。 – 2012-07-26 20:03:30