2012-06-26 13 views
15

मैं एक विशेष रूप से कपटी बग को डिबग कर रहा हूं जिसे अब मैं अप्रत्याशित परिवर्तनों के कारण होने का मानता हूं जो अलग-अलग शीर्षकों में शामिल होते हैं (या नहीं) अलग-अलग व्यवहार से होते हैं।क्या मैं संकलन के दौरान आउटपुट भेजने के लिए सी ++ प्रीप्रोसेसर प्राप्त कर सकता हूं?

यही मेरी कोड की संरचना नहीं है, लेकिन चलो बस इस परिदृश्य पर एक नज़र डालें:

#include "Newly_created_header_which_accidentally_undefines_SOME_DEFINE.h" 

// ... 

#ifdef SOME_DEFINE 
    code_which_i_believe_i_am_always_running(); 
#else 
    code_which_fails_which_i_have_forgotten_about(); // runtime error stack traces back here, but I don't know this... or maybe it's some strange linker error 
#endif 

मैं अपने Git माध्यम से खोज करता है और बग के कारण को कम, संकलन और मेरे कोड चल रहा अनगिनत बार, केवल कई घंटों के बाद खोजने के लिए कि बग के कारण आवश्यक अंतर केवल एक सौम्य और असंबंधित हेडर प्रतीत होता है।

शायद यह एक महान तर्क है कि प्रीप्रोसेसर मूल रूप से क्यों बेकार है।

लेकिन मुझे यह पसंद है। प्रीप्रोसेसर अच्छा है क्योंकि यह हमें शॉर्टकट बनाने देता है। यह केवल इतना है कि इनमें से कुछ शॉर्टकट्स, जब सावधानी से उपयोग नहीं किया जाता है, तो हमें बट में बहुत मुश्किल से काट लें।

तो इस समय अगर मैं #echo "Running old crashy code" की तरह एक निर्देश इस्तेमाल कर सकते हैं, जहां मैं संकलन के दौरान इस को देखने के लिए सक्षम हो जाएगा यह मदद की है | पर तो मैं तुरंत बंद टिप किया जा सकता है की जांच शुरू करने के लिए क्यों SOME_DEFINE परिभाषित नहीं किया गया था।

जहाँ तक मुझे अगर SOME_DEFINE परिभाषित किया गया है का निर्धारण करने के सरल तरीके से जानते हैं की तरह

#ifndef SOME_DEFINE 
    printf("SOME_DEFINE not defined!!\n"); 

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

कहा जा रहा है कि, इस स्थिति में, प्रिंट (या लॉग या यहां तक ​​कि अपवाद फेंकने) का उपयोग करने के लिए एक स्वीकार्य बात हो सकती है क्योंकि मैं वास्तव में संदिग्ध कोड को धीमा करने या छेड़छाड़ करने की परवाह नहीं करता। लेकिन यह लागू नहीं होता है यदि मेरे पास उदाहरण के लिए दो कोड पथ हैं, जिनमें से दोनों महत्वपूर्ण हैं, और मैं बस संकलित समय पर जानना चाहता हूं जिसे सक्रिय किया जा रहा है। मुझे उस कोड को चलाने के बारे में चिंता करने की ज़रूरत है जो प्रोग्राम की शुरुआत में प्रीप्रोसेसर-कंडीशन वाले प्रिंट करता है।

यह वास्तव में प्रश्न पूछने का एक लंबा हवादार तरीका है, "क्या मैं प्रीप्रोसेसर निर्देश का उपयोग कर संकलन के दौरान उत्पादन में स्ट्रिंग को प्रतिबिंबित कर सकता हूं?"

+3

'#err का प्रयोग करें या निर्देश? या '# चेतावनी ', अगर प्रीप्रोसेसर इसका समर्थन करता है। –

+0

'# चेतावनी 'इस तरह अधिक है क्योंकि यह प्रसंस्करण को रोक नहीं पाएगा। लेकिन हाँ यह बहुत ज्यादा है। कृपया उत्तर दें! –

+0

मुझे लगता है कि कुछ कंपाइलर्स पर '# चेतावनी '\' # चेतावनी' भी है, लेकिन मुझे लगता है कि यह गैर-मानक और कम सार्वभौमिक है। मैंने कुछ पर '#pragma संदेश ("WARN") 'और' # print' भी देखा है। – jedwards

उत्तर

18

आप #error निर्देश का उपयोग करते हैं, उत्पादन सीधे प्रिंट की जाएगी और संकलन बंद हो जाएगा:

$ make days_in_month 
cc  days_in_month.c -o days_in_month 
days_in_month.c:2:2: error: #error "ugly!" 
make: *** [days_in_month] Error 1 
$ 

यह आपको काफी क्या चाहता था नहीं हो सकता है, लेकिन यह काम जल्दी से किया जाता है।

$ cat days_in_month.c 
#include <stdio.h> 
#error "ugly!" 
... 

आप प्रसंस्करण चाहते हैं जारी रखने के लिए, आप #warning उपयोग कर सकते हैं: लाइन में मैं क्या देख रहा था के साथ

$ make days_in_month 
cc  days_in_month.c -o days_in_month 
days_in_month.c:2:2: warning: #warning "ugly!" [-Wcpp] 
$ head days_in_month.c 
#include <stdio.h> 
#warning "ugly!" 
+0

यह आउटपुट उत्पन्न करेगा जो देखना आसान है। मैं वास्तव में एक विकल्प की उम्मीद कर रहा था जहां मैं उस सटीक स्ट्रिंग को परिभाषित कर सकता हूं जो इसे थकाता है (इसलिए यह उतना स्पष्ट हो सकता है जितना मैं चाहता हूं) लेकिन यह काम पूरा हो जाएगा। –

+0

ध्यान दें कि आपको स्ट्रिंग में जो कुछ भी चाहिए, उसे रखने की अनुमति है; अगर आप 'XXX चेतावनी XXX' ब्लॉक की पूरी स्क्रीन चाहते हैं, तो खुद को खटखटाएं। :) (मुझे आश्चर्य है कि क्या टर्मिनल रंग भी निकलता है?) – sarnold

+0

@Linuxios: वह मेरा _first_ प्रयास था ... :) इस जवाब का मेरा पहला संस्करण सिर्फ '# त्रुटि' था, जब तक कि मैंने कुछ और वर्बोज़ नहीं करने का सोचा - - मुझे विश्वास था कि मैंने केवल एक चेतावनी पेश करने का एक तरीका देखा था। – sarnold

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

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