2012-01-29 19 views
23

मैं वीबी 6 में निम्नलिखित सी कोड के समान कुछ कैसे कर सकता हूं?डीबग मोड?

#ifdef _DEBUG_ 
    // do things 
#else 
    // do other things 
#end if 

उत्तर

32

यह आपके द्वारा उपयोग की जाने वाली अन्य भाषाओं के समान ही है। वाक्य रचना इस तरह दिखता है:

#If DEBUG = 1 Then 
    ' Do something 
#Else 
    ' Do something else 
#End If 

यह याद रखना महत्वपूर्ण है, तो आप सिर्फ याद रखें कि वाक्य रचना वास्तव में वीबी 6 में अन्य प्रवाह नियंत्रण बयानों के समान ही है, सिवाय इसके कि संकलन समय सशर्त, एक पाउंड के साथ शुरू आसान है साइन (#)।

चाल वास्तव में DEBUG (या जो कुछ भी) निरंतर परिभाषित कर रही है क्योंकि मुझे पूरा यकीन है कि डिफ़ॉल्ट रूप से परिभाषित नहीं किया गया है।

  1. प्रत्येक स्रोत फ़ाइल के शीर्ष पर लगातार परिभाषित करने के लिए #Const कीवर्ड का प्रयोग करें: वहाँ यह करने के दो मानक तरीके हैं। इस तरह से परिभाषित परिभाषा पूरे स्रोत मॉड्यूल में मान्य है। यह कुछ ऐसा दिखाई देगा:

    #Const DEBUG = 1 
    
  2. प्रोजेक्ट की गुणों में निरंतर सेट करें। यह एक निरंतर परिभाषित करेगा जो पूरे प्रोजेक्ट में मान्य है (और शायद आप "डीबग" मोड संकेतक के लिए क्या चाहते हैं)।

    ऐसा करने के लिए, "प्रोजेक्ट गुण" संवाद बॉक्स के "बनाओ" टैब पर "सशर्त संकलन स्थिरांक" पाठ बॉक्स में निम्नलिखित की तरह कुछ दर्ज करें:

    DEBUG = 1 
    

    आप कर सकते हैं

    DEBUG = 1 : VERSION2 = 1 
    
: एक कॉलन ( :) के साथ उनमें से प्रत्येक को अलग करके इस संवाद में कई स्थिरांक को परिभाषित

याद रखें कि किसी भी स्थिर है जो नहीं परिभाषित 0.

+0

यह शानदार है, बस एक सवाल लग रहा है, जब आप exe के रिलीज़ संस्करण संकलन मैं तुम्हें डीबग = 0 सेट करना होगा या वीबी ऑटो यह पता लगाता है यह सोचते हैं रहा हूँ और किसी भी तरह सुनिश्चित करने के लिए डिबग सामान है का प्रबंधन करता है संकलित नहीं किया गया है (मैं इसे इकट्ठा करने में सक्षम होने के लिए कंपाइलर में आंतरिक रूप से हार्डकोड किया जाना चाहिए, असंभव लेकिन बस सुनिश्चित करना चाहता था)। तो रिलीज से पहले बस DEBUG = 0 सेट करें और आप संकलित करने के लिए तैयार हैं? –

+1

@Erx: नहीं, कंपाइलर द्वारा कोई ऑटो-डिटेक्शन नहीं किया गया है। 'DEBUG' प्रतीक स्वचालित रूप से परिभाषित नहीं किया गया है, आपको इसे स्वयं करना है। तो "रिलीज" मोड में स्विच करना एक मैन्युअल कार्रवाई है। हां, इस उदाहरण में, आप संकलन-समय 'DEBUG' स्थिरांक को 0 –

+0

में बदल देंगे यदि आप DEBUG = 1 को अपने कोड सामान्य घोषणा मॉड्यूल क्षेत्र में डाल देंगे तो क्या होगा ...? क्या यह अभी भी काम करेगा या असफल होगा? –

11

कोड़ी सशर्त संकलन बारे में बताया गया है माना जाता है। मैं यह जोड़ना चाहता हूं कि यदि आप आईडीई पर डिबगिंग करते समय अलग-अलग व्यवहार चाहते हैं (उदा। अपनी खुद की त्रुटि हैंडलिंग बंद करें ताकि आईडीई जाल त्रुटियों को बंद कर दें) तो आप सशर्त संकलन की आवश्यकता नहीं है। आप इस तरह रनटाइम पर आईडीई का पता लगा सकते हैं।

On Error Resume Next 
Debug.Print 1/0 
If Err=0 then 
    'Compiled Binary 
Else 
    'in the IDE 
End if 

यह काम करता है क्योंकि डीबग.प्रिंट संकलित EXE में छोड़ा जाता है।

  • संपादित फिर से शुरू करें अगला त्रुटि पर बंद करने के लिए याद रखें!
  • संपादित आप this (धन्यवाद CraigJ) की तरह एक समारोह में चेक लपेट कर सकते हैं
+1

यह एक अच्छी टिप है, लेकिन शायद आप किसी बिंदु पर 'त्रुटि फिर से शुरू करें' बंद करना चाहते हैं, आह? :-) –

+1

क्यों? त्रुटि फिर से शुरू करें अगला सबसे अच्छा त्रुटि हैंडलिंग रणनीति है - उपयोगकर्ता को इस तरह से कोई त्रुटि नहीं दिखाई देती है :) ठीक है, कम से कम जब तक वह वास्तविक डेटा नहीं देखता है ... अधिक गंभीरता से, हम केवल वैश्विक चर का उपयोग कर रहे हैं (inEXE) और कार्यक्रम शुरू होने पर इसे प्रारंभ करना; डीबग और ट्रेस ध्वज के लिए एक ही है। हां, यह दृष्टिकोण प्रीप्रोसेसर निर्देशों का उपयोग नहीं करता है, लेकिन रन-टाइम ओवरहेड (विभिन्न झंडे की जांच से) डेटाबेस पहुंच या यहां तक ​​कि सरल यूआई ड्राइंग की तुलना में नगण्य है। – Arvo

+0

आप वैश्विक झंडा घोषित करना बेहतर होगा, और उप मेन की शुरुआत की ओर कहीं भी यह जांच करें। इस तरह आप न्यूनतम ओवरहेड के साथ डीबग की जांच कर सकते हैं। –

6

MarkJ रूप में एक ही प्रभाव को प्राप्त करने के लिए, लेकिन त्रुटि हैंडलिंग के साथ, आप निम्न कोड का उपयोग कर सकते हैं।

Public Function GetRunningInIDE() As Boolean 

    Dim x As Long 
    Debug.Assert Not TestIDE(x) 
    GetRunningInIDE = x = 1 

End Function 

Private Function TestIDE(x As Long) As Boolean 

    x = 1 

End Function 

जब आप आईडीई के भीतर से चल रहे हैं, वहाँ एक समारोह (जो हास्यास्पद छोटा है) को कॉल करने का एक अतिरिक्त भूमि के ऊपर हो जाएगा। संकलित होने पर, यह एक साधारण संख्या तुलना में मूल्यांकन करता है।

+0

+1 के बाद किया जाता है। यह वास्तव में काम पर हम वास्तव में उपयोग करते हैं, लेकिन मैंने उस कोड को पोस्ट नहीं किया है, क्योंकि यह मेरे नियोक्ता से संबंधित है। – MarkJ

2

यह मेरा छोटा और स्थिर कोड है। मुझे लगता है कि यह सशर्त स्थिरांक से बेहतर है, क्योंकि आपको इसे हर जटिल समय में बदलने की जरूरत नहीं है।

Public Function InIDE() As Boolean 
    On Error Resume Next 
    Debug.Print 0/0 
    InIDE = Err.Number <> 0 
End Function 
+0

+1 सर्वश्रेष्ठ उत्तर क्योंकि यह छोटा और प्यारा है और जब भी आपको पुन: संकलित करने की आवश्यकता होती है तो परियोजना गुणों को बदलने की आवश्यकता नहीं होती है। – Keith

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