मैं किसी मौजूदा प्रोग्राम का कुछ विश्लेषण करने की कोशिश कर रहा हूं और प्रोग्राम को बहुत अधिक संशोधित किए बिना लाइन नंबर लॉग करने की आवश्यकता है। मैं __LINE__ के साथ खेल रहा हूं और कुछ ऐसा करने की उम्मीद कर रहा था:

file.h:

void Function( int iLine = __LINE___ );   // original function had no arguments, but now overloaded to default __LINE__

file.cpp:

void Function( int iLine ) {    // original function had no arguments, but now changed to int iLine
    // do something here
    // log iLine number to a file for analysis
}

main.cpp कॉल करें:

Function();    // call existing function

हालाँकि, अब मुझे पता है कि यह काम नहीं करेगा क्योंकि iLine हमेशा file.h डेफिनिशन लाइन नंबर होता है।

मैंने स्टैकवॉकर की कोशिश की है, लेकिन कठिनाई भी हुई और थोड़ा अधिक लग रहा था।

मूल फ़ाइल परिवर्तनों को न्यूनतम रखते हुए इस तक कैसे पहुंचे इस पर कोई सुझाव?

3
alan478 14 मार्च 2020, 18:26
सी ++ प्रश्न पूछते समय सी को टैग न करें जिसमें कोई विशेष सी घटक नहीं है। स्टैक टैग का कोई कारण भी नहीं था।
 – 
Eric Postpischil
14 मार्च 2020, 18:41

2 जवाब

विकल्प 1: फ़ंक्शन के बजाय मैक्रो जैसे फ़ंक्शन का उपयोग करें। मैक्रो "कॉल" साइट में विस्तारित होगा, इस प्रकार सही लाइन देगा। मैक्रो स्वयं तर्क को उचित कार्य में पारित करने जितना आसान हो सकता है।

विकल्प 2: इसके बजाय std::source_location का उपयोग करें, जिसे आगामी c++20 में पेश किया जाएगा।

3
eerorika 14 मार्च 2020, 18:32

आप देख सकते हैं कि ASSERT() मैक्रो को कैसे परिभाषित किया जाता है।

अगर मुझे अच्छी तरह याद है, तो यह कुछ इस प्रकार है:

#define ASSERT(x) _assert( (x), __FILE__, __LINE__ );
void _assert( bool expression, const char* pfile, int line );

इसलिए, ASSERT() मैक्रो का उपयोग _assert() फ़ंक्शन के लिए एक आवरण के रूप में किया जाता है, इसलिए इसे कॉल साइट पर विस्तारित किया जाता है, और यह अप्रासंगिक है कि लक्ष्य फ़ंक्शन इनलाइन हो जाता है या नहीं।

1
Mike Nakis 14 मार्च 2020, 18:43
ऐसा लगता है कि _assert का यह प्रयोग मेरे कंप्यूटर पर काम नहीं कर रहा है। फिर भी, मैक्रो NDEBUG अपरिभाषित के साथ, यह मेरे लिए इसके साथ काम करता है: #include #define ASSERT(x) assert((x), __FILE__, __LINE__); अधिक के लिए देखें en.cppreference.com/w/cpp/error/assert विवरण।
 – 
Ben_LCDB
15 मई 2021, 22:45