पर विचार करें निम्नलिखित कोड:सी ++ समारोह कॉल पहचानकर्ता
void Foo() {
......
LOG_ERROR("I'm error 1") // call 1
.....
LOG_ERROR("I'm error 2") // call 2
.....
}
LOG_ERROR()
एक मैक्रो है। LOG_ERROR()
को कोड में पहचानने की स्ट्रिंग मुद्रित करनी चाहिए, जबकि धारणा यह है कि कोड बदल सकता है, लेकिन A::Foo()
अपरिवर्तित रहेगा। कोड परिवर्तनों के दौरान पहचानकर्ता को बनाए रखना चाहिए।
यह LOG_ERROR()
, को तर्क के रूप में जोड़ने त्रुटि कोड द्वारा हल किया जा सकता है, लेकिन हम त्रुटि का प्रबंधन करने के कोड बोझ प्रोग्रामर से निकालना चाहते हैं।
__LINE__
का उपयोग करना कोई जवाब नहीं है, क्योंकि Foo()
बिल्ड से निर्माण में स्थानांतरित हो सकता है।
इसलिए मैं LOG_ERROR()
रिश्तेदार की पहचान Foo()
के शुरू करने के लिए के बारे में सोचा:
- एक। फ़ाइल नाम (
__FILE__
) द्वारा पहचानें + फ़ंक्शन नाम (__FUNCTION__
) +LOG_ERROR()
की लाइन संख्याFoo()
से संबंधित है। - बी। फ़ाइल नाम (
__FILE__
) द्वारा पहचानें + फ़ंक्शन नाम (__FUNCTION__
) +LOG_ERROR()
Foo()
में कॉल नंबर।
समाधान कुलपति ++ 2008 और जी ++ 4.1.1 कम से कम के साथ काम किया जाना चाहिए।
एक प्रस्तावित समाधान (link text) है:
#define ENABLE_LOG_ERROR static const int LOG_ERROR_start_line = __LINE__
#define LOG_ERROR(s) cerr << "error #" << (__LINE__ - LOG_ERROR_start_line) \
<< " in " << __func__ << ": " << s << endl
void Foo() {
ENABLE_LOG_ERROR;
//...
LOG_ERROR("error 1");
int i;
LOG_ERROR("error 2");
}
यह LOG_ERROR()
और वहाँ कई इस तरह के कार्यों से युक्त प्रत्येक कार्य की शुरुआत में ENABLE_LOG_ERROR
लिखने के लिए उपयोगकर्ता के लिए बाध्य करेगा।
क्या कार्य पूरा करने का कोई और तरीका है?
@idimba, यदि यह बहुत अधिक परेशानी नहीं है, तो आप प्रत्येक फ़ंक्शन नाम के ठीक बाद 'ENABLE_LOG_ERROR;' स्वचालित रूप से जोड़ने के लिए एक स्क्रिप्ट का उपयोग कर सकते हैं। मैं उस चाल का उपयोग करता हूं जब मैं * तृतीय पक्ष कोड का पता लगाता हूं। –
अच्छा विचार है, लेकिन यह __LINE__ को प्रभावित करेगा जिसे हम अपने लॉगिंग उप sustem में व्यापक रूप से उपयोग करते हैं। – dimba