2012-01-16 14 views
9

मैं युक्त जानकारी(), डीबग() और त्रुटि() फ़ंक्शंस के साथ log.c फ़ाइल बनाना चाहता हूं। ये फ़ंक्शन प्रिंटिंग फ़ाइल नाम, लाइन नंबर, आदि के बिना काम कर रहे हैं। तो जब मैं इस फ़ंक्शन में से किसी एक को कॉल करता हूं तो मैं फ़ाइल नाम, लाइन नंबर और कॉलर का फ़ंक्शन नाम डंप करना चाहता हूं। तो हम वास्तव में वापस कैसे पता लगा सकते हैं? क्या सी पर वापस पता लगाने का कोई तरीका है या यदि हम मैक्रोज़ का उपयोग करते हैं, तो यह कैसे किया जा सकता है?फ़ाइल नाम, लाइन नंबर और कॉलिंग फ़ंक्शन का फ़ंक्शन नाम प्रिंट करें - सी प्रोग

+0

http://stackoverflow.com/questions/2651850/can-func-get-the-lineno-who-call-itself-cc की – kennytm

+1

संभव डुप्लिकेट [C/C++ लाइन नंबर] (http://stackoverflow.com/questions/2849832/cc-line- संख्या) – user7116

+0

@ केनीटीएम: धन्यवाद! जवाब वहाँ है। – sura2k

उत्तर

21

मैं मानकों के माध्यम से कार्य करने के लिए डेटा दे देते हैं (शायद एक मैक्रो की मदद मिल)

int info(const char *fname, int lineno, const char *fxname, ...) { /* ... */ } 
int debug(const char *fname, int lineno, const char *fxname, ...) { /* ... */ } 
int error(const char *fname, int lineno, const char *fxname, ...) { /* ... */ } 

और उन्हें फोन करने के लिए

info(__FILE__, __LINE__, __func__, ...); 
debug(__FILE__, __LINE__, __func__, ...); 
error(__FILE__, __LINE__, __func__, ...); 

नोट: __func__ C99 है; जीसीसी, मोड में C89 है __FUNCTION__

+0

क्या इस तरह के कार्यों को बनाने के लिए कोई तरीका है, बिना __FILE __, .. आदि पैरामीटर पास किए बिना? – sura2k

+8

हाँ, एक मैक्रो के साथ। उदाहरण के लिए, सी 99 के लिए (जिसमें वैरैडिक मैक्रोज़ हैं): '# परिभाषित जानकारी (...) जानकारी (__ FILE__, __LINE__, __func__, __VA_ARGS __)' – pmg

+0

धन्यवाद! मुझे यही चाहिए। – sura2k

5

यदि आप मैक्रोज़ का उपयोग करते हैं, तो मेरा मानना ​​है कि आप __FILE__,और __FUNCTION__ का उपयोग करके यह काम कर सकते हैं। उदाहरण के लिए,

#define INFO(msg) \ 
    fprintf(stderr, "info: %s:%d: ", __FILE__, __LINE__); \ 
    fprintf(stderr, "%s", msg); 

तुम भी कार्यों इस्तेमाल कर सकते हैं, लेकिन आप यकीन है कि वे सही मूल्य था बनाने के लिए __FILE__ में पारित करने के लिए, आदि की आवश्यकता होगी।

+1

'gcc -std = gnu99' कहता है '__LINE__' एक पूर्णांक है और इसे' char * 'पर कास्टिंग करने के बारे में चेतावनी देता है। दूसरी पंक्ति 'fprintf (stderr, "जानकारी नहीं होनी चाहिए:% s:% d:", __FILE__, __LINE__); \ '('% s' '% d' द्वारा प्रतिस्थापित किया गया है)? – matec

+0

फिक्स्ड! वहां कुछ पुराने स्कूल पायथन लेना। – Michael

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