2010-11-17 13 views
12

मैं अपने कोड में एक विशिष्ट चेतावनी (W1035) को निष्क्रिय करना चाहते के बाद से मुझे लगता है कि संकलक इस चेतावनी के बारे गलत है:मैं अस्थायी रूप से "वापसी मूल्य को अपरिभाषित" चेतावनी कैसे अक्षम कर सकता हूं?

function TfrmNagScreen.Run: TOption; 
begin 
    if ShowModal = mrOk then 
    Result := TOption(rdgAction.EditValue) 
    else 
    Abort 
end; 

कोई रास्ता परिणाम अपरिभाषित जा सकता है, के बाद से Abort फेंकता EAbort

मैंने कोशिश की:

  • {$WARN 1035 Off}: कुछ विशिष्ट त्रुटियों के लिए जाहिरा तौर पर यह केवल काम करता है (Documentation देखें)
  • {$W-1035}: सभी

मैं जानता हूँ कि मैं चेतावनी बंद कर सकते हैं पर कुछ नहीं करता वैश्विक स्तर पर परियोजना विकल्पों में, या {$WARNINGS OFF} का उपयोग करके, लेकिन यह यहां नहीं है।

संपादित करें: मैंने इसे #89744 के रूप में क्यूसी किया है।

+0

हालांकि यह सच है कि संकलक कभी-कभी भ्रमित हो जाता है और बिना किसी कारण के इस चेतावनी की रिपोर्ट करता है, इस मामले में संकलक तकनीकी रूप से सही है। परिणाम सशर्त से पहले सौंपा नहीं गया है और केवल सशर्त की वास्तविक शाखा पर ही सौंपा गया है। तथ्य यह है कि यदि स्थिति गलत है तो फ़ंक्शन समय-समय पर लौटाता है, यह संकलक के लिए अप्रासंगिक है। –

+0

@codeelgance: काफी सच है, लेकिन मुझे लगता है कि 'abort' एक अंतर्निहित कार्य है और संकलक स्थिति को पहचान सकता है। –

उत्तर

13

आप वैश्विक स्तर पर इस चेतावनी को अक्षम नहीं कर सकते हैं, लेकिन आप स्थानीय रूप से चेतावनी को अक्षम करने के लिए {$WARN NO_RETVAL OFF} का उपयोग कर सकते हैं।

{$WARN NO_RETVAL OFF} 
function TfrmNagScreen.Run: TOption; 
begin 
    if ShowModal = mrOk then 
    Result := TOption(rdgAction.EditValue) 
    else 
    Abort 
end; 
{$WARN NO_RETVAL ON} 
+0

आपको 'NO_RETVAL' कहां से मिला, क्योंकि यह एम्बरकाडेरो दस्तावेज़ में नहीं है? –

+1

@ जेन्स, http://stackoverflow.com/questions/376785/identifiers-for-delphis-warn-compiler-directive/377034#377034 – WileCau

+0

ठीक है, तो चेतावनी ग्रंथों के अधिकांश (सभी?) को 'DCCStrs में परिभाषित किया गया है .pas', जानना अच्छा है :) –

9

मैं एक डेल्फी संकलक इस समय उपलब्ध नहीं है, लेकिन कोड उलटफेर को दूर करने के if..else बना सकता है चेतावनी चले जाओ:

function TfrmNagScreen.Run: TOption; 
begin 
    if ShowModal <> mrOk then 
    Abort; 

    Result := TOption(rdgAction.EditValue); 
end; 

भी देखें How to disable a warning in Delphi about “return value … might be undefined”?

+0

+1 वह काम करता है (विशेष स्थिति के लिए) और मैंने इसके बारे में सोचा नहीं था, हालांकि यह सामान्य समस्या को हल नहीं करता है। –

1

आप संकलक को बेवकूफ बनाने की एक साफ चाल का उपयोग कर सकते हैं। एक पुस्तकालय समारोह के रूप में तो निर्धारित करें:

if ShowModal = mrOk then 
    Result := TOption(rdgAction.EditValue) 
else 
    Abort(Result) 

संकलक सोचता है कि आप के बाद से यह एक वर पैरामीटर है परिणाम के लिए लिखा है और यह मिमिया बंद हो जाता है:

procedure Abort(var X); 
begin 
    SysUtils.Abort; 
end; 

के रूप में तब आप अपने समारोह लिख सकते हैं।