मैं एक विशेष रूप से कपटी बग को डिबग कर रहा हूं जिसे अब मैं अप्रत्याशित परिवर्तनों के कारण होने का मानता हूं जो अलग-अलग शीर्षकों में शामिल होते हैं (या नहीं) अलग-अलग व्यवहार से होते हैं।क्या मैं संकलन के दौरान आउटपुट भेजने के लिए सी ++ प्रीप्रोसेसर प्राप्त कर सकता हूं?
यही मेरी कोड की संरचना नहीं है, लेकिन चलो बस इस परिदृश्य पर एक नज़र डालें:
#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");
यह निश्चित रूप से काम किया जाएगा कुछ करने के लिए है, लेकिन वहाँ कोई अच्छे कारण के लिए इस कार्य में प्रदर्शन किया जा रहा है रनटाइम क्योंकि यह संकलन समय पर पूरी तरह से निर्धारित है। यह बस कुछ है जो मैं संकलन समय पर देखना चाहता हूं।
कहा जा रहा है कि, इस स्थिति में, प्रिंट (या लॉग या यहां तक कि अपवाद फेंकने) का उपयोग करने के लिए एक स्वीकार्य बात हो सकती है क्योंकि मैं वास्तव में संदिग्ध कोड को धीमा करने या छेड़छाड़ करने की परवाह नहीं करता। लेकिन यह लागू नहीं होता है यदि मेरे पास उदाहरण के लिए दो कोड पथ हैं, जिनमें से दोनों महत्वपूर्ण हैं, और मैं बस संकलित समय पर जानना चाहता हूं जिसे सक्रिय किया जा रहा है। मुझे उस कोड को चलाने के बारे में चिंता करने की ज़रूरत है जो प्रोग्राम की शुरुआत में प्रीप्रोसेसर-कंडीशन वाले प्रिंट करता है।
यह वास्तव में प्रश्न पूछने का एक लंबा हवादार तरीका है, "क्या मैं प्रीप्रोसेसर निर्देश का उपयोग कर संकलन के दौरान उत्पादन में स्ट्रिंग को प्रतिबिंबित कर सकता हूं?"
'#err का प्रयोग करें या निर्देश? या '# चेतावनी ', अगर प्रीप्रोसेसर इसका समर्थन करता है। –
'# चेतावनी 'इस तरह अधिक है क्योंकि यह प्रसंस्करण को रोक नहीं पाएगा। लेकिन हाँ यह बहुत ज्यादा है। कृपया उत्तर दें! –
मुझे लगता है कि कुछ कंपाइलर्स पर '# चेतावनी '\' # चेतावनी' भी है, लेकिन मुझे लगता है कि यह गैर-मानक और कम सार्वभौमिक है। मैंने कुछ पर '#pragma संदेश ("WARN") 'और' # print' भी देखा है। – jedwards