2008-09-29 11 views

उत्तर

24

उपयोग करें:

{$IFDEF DEBUG} 
... 
{$ENDIF} 
+0

और सुनिश्चित करें कि परियोजना विकल्प DEBUG को परिभाषित करते हैं। मुझे लगता है कि केवल नए डेल्फी (डी 2007 और ऊपर?) संस्करणों ने डिबग बिल्ड के लिए इसे डिफ़ॉल्ट रूप से सेट किया है। –

+4

पुराने संस्करणों के लिए आप {$ IFOPT D +} का उपयोग कर सकते हैं। 'डी' "डीबग जानकारी के साथ संकलन" के लिए कंपाइलर विकल्प प्रतीक है।'डी +' इंगित करता है कि यदि विकल्प * चालू * है तो केवल निम्न को संकलित किया जाना चाहिए। – Deltics

+1

अधिक पठनीय {$ IFDEF DEBUG} की पोर्टेबिलिटी के लिए आप निश्चित रूप से एक मानक परिभाषा में {$ IFOPT C +} {$ DEFINE DEBUG} {$ ENDIF} जैसे कुछ शामिल कर सकते हैं फ़ाइल (डेल्फी के संस्करणों से संबंधित अनुभागों में) आपके लिए डीईबीयूजी को स्वत: परिभाषित नहीं करते हैं। ध्यान दें कि यह "ऑटो-डिफ़ाइन" हमेशा विश्वसनीय नहीं है। DEBUGINFO मुझे लगता है कि ऑटो-डिफ़ाइंड है लेकिन DEBUG केवल तभी परिभाषित किया जाता है जब आप DEBUG बिल्ड के लिए डिफ़ॉल्ट सशर्त छोड़ देते हैं (वे डीईबीयूजी को "फैक्ट्री" सेटिंग के रूप में शामिल करें, लेकिन इसे हटाया जा सकता है या नहीं। यानी यह "अंतर्निहित" परिभाषा नहीं है जब डीबग जानकारी के साथ बिल्डिंग – Deltics

7

अलावा क्या कहा lassevk, आप भी संकलक मूल्यांकन के कुछ अन्य तरीकों का उपयोग कर सकते हैं से (डेल्फी 6 के बाद से, मेरा मानना ​​है):

{$IF NOT DECLARED(SOME_SYMBOL)} 
    // Mind you : The NOT above is optional 
{$ELSE} 
{$IFEND} 

जाँच करने के लिए यदि कंपाइलर में यह सुविधा है, तो उपयोग करें:

{$IFDEF CONDITIONALEXPRESSIONS} 

इसके लिए कई उपयोग हैं।

उदाहरण के लिए, आप आरटीएल के संस्करण की जांच कर सकते हैं; डेल्फी मदद से:

आप RTLVersion $ अगर में भाव क्रम पुस्तकालय संस्करण स्तर स्वतंत्र रूप से संकलक संस्करण स्तर की परीक्षण करने के लिए उपयोग कर सकते हैं।
उदाहरण:

CompilerVersion असाइन किया गया है: {$ यदि RTLVersion> = 16.2} ... {$ IFEND}

इसके अलावा, संकलक संस्करण ही कोड से जाँच की जा सकती, फिर सिस्टम यूनिट संकलित होने पर संकलक द्वारा एक मान। यह संकलक संकलक सुविधाओं/ भाषा वाक्यविन्यास के स्तर को इंगित करता है, जो RTLVersion के स्वतंत्र रूप से अग्रिम कर सकता है। कंपाइलरवर्सन का परीक्षण $ IF अभिव्यक्तियों में किया जा सकता है और VERxxx सशर्त परिभाषा के परीक्षण के बजाय का उपयोग किया जाना चाहिए। के लिए हमेशा ज्ञात संशोधन स्तर से अधिक या उससे कम परीक्षण करें। एक विशिष्ट संशोधन स्तर के लिए परीक्षण के लिए यह एक बुरा विचार है।

{$IF NOT DECLARED(UTF8String)} 
type 
    UTF8String = type AnsiString; 
{$IFEND} 

आशा इस मदद करता है:

एक और बात मैं नियमित रूप से करते हैं, एक प्रतीक है, जब यह अभी तक परिभाषित नहीं कर रहा है (आगे की संगतता के लिए अच्छा), इस तरह परिभाषित है! यदि कोई अनुप्रयोग आईडीई डिबगर के तहत चल रहा है

procedure TfrmMain.Button1Click(Sender: TObject); 
begin 
    {$IFDEF MY_CONDITIONAL} 
    ShowMessage('my conditional IS defined!'); 
    {$ELSE} 
    ShowMessage('my conditional is NOT defined!'); 
    {$ENDIF} 

    {$IFNDEF MY_CONDITIONAL} 
    ShowMessage('My conditional is explicitly NOT defined'); 
    {$ENDIF} 
end; 
+0

घोषित(), duh –

+0

@ user205376: तेज आंखों के लिए धन्यवाद, मैंने टाइपो तय किया। – PatrickvL

3

ये नियंत्रण निर्देशों उपलब्ध हैं:

{$IFDEF} 
{$ELSE} 
{$ENDIF} 
{$IFNDEF} //if *not* defined 

और वे जैसा कि यहाँ दिखाया इस्तेमाल किया जा सकता। एक कंपाइलर निर्देश के समान नहीं है लेकिन अभी भी बहुत उपयोगी है। उदाहरण के लिए:

ReportMemoryLeaksOnShutdown := DebugHook <> 0; // show memory leaks when debugging 
+2

आप {$ IFOPT} भूल गए हैं, जिसका उपयोग सीधे कंपाइलर सेटिंग्स के लिए परीक्षण करने के लिए किया जा सकता है। {$ IFOPT डी +} // डिबग जानकारी पर {$ IFOPT सी +} // दावे सक्षम आदि – Deltics

संबंधित मुद्दे