2010-03-24 14 views
5

मैं है निम्नलिखित कोड का टुकड़ा:सी ++ सशर्त संकलन

#ifdef DO_LOG 
#define log(p) record(p) 
#else 
#define log(p) 
#endif 

void record(char *data){ 
..... 
..... 
} 

अब अगर मैं अपने कोड और DO_LOG में log("hello world") फोन परिभाषित नहीं है, लाइन संकलित किया जाएगा दूसरे शब्दों में, यह स्मृति को खा जाएगा स्ट्रिंग "हैलो वर्ल्ड" के लिए?

पीएस कार्यक्रम में बहुत सी रिकॉर्ड कॉल हैं और यह स्मृति संवेदनशील है, तो क्या सशर्त रूप से संकलित करने का कोई अन्य तरीका है ताकि यह केवल #define DO_LOG पर निर्भर हो?

+2

आपको अपनी खुद की लॉगिंग लाइब्रेरी लागू नहीं करनी चाहिए। वहां पर्याप्त है। यहां मैं जो उपयोग कर रहा हूं: http://www.templog.org। – sbi

+2

@ एसबीआई मुझे नहीं पता। मैंने अपना खुद लिखा है और यह खूबसूरती से काम करता है। कुछ सीखना सीखने का यह सबसे अच्छा तरीका है। :-) – Konrad

+1

@ कोनराड: मैंने भी ऐसा किया, लेकिन एक स्थापित पुस्तकालय के संचित ज्ञान से बेहतर होना मुश्किल है। – sbi

उत्तर

14

परिणामस्वरूप बाइनरी का निरीक्षण करके स्वयं को सत्यापित करने के लिए यह छोटा होना चाहिए।

मैं कहूंगा "नहीं", क्योंकि अभिव्यक्ति पूरी तरह से दूर हो जाती है, संकलक स्ट्रिंग को कभी नहीं देख पाएगा (इसे प्रीप्रोसेसर के मैक्रो विस्तार द्वारा हटा दिया गया है)।

+1

यह सही है। और इसे सत्यापित करने के लिए एक प्रोग्राम लिखना मुझे 30 सेकंड के लिए ले गया। –

+2

@unwind और @Neil: मुझे दिलचस्पी होगी कि आप कैसे सत्यापित करेंगे कि मनाया व्यवहार केवल आपके कंपाइलर की विशिष्टता नहीं है। – sbi

+0

@ एसबीआई: मैंने नहीं किया, मैं खुशी से स्वीकार करूंगा। मुझे लगता है कि मेरे जवाब में जो तर्क मैं उपयोग करता हूं वह ध्वनि है; प्रीप्रोसेसर मैक्रो को परिभाषित की तरह काम करना चाहिए, यानी स्ट्रिंग शब्दशः स्रोत से गायब हो जाता है। मानकों को उद्धृत करने के लिए स्वतंत्र महसूस करें यदि यह गलत है, तो मुझे जानकर खुशी होगी। – unwind

4

चूंकि प्रीप्रोसेसर कंपाइलर से पहले चलता है, इसलिए संकलक तब भी मौजूद नहीं होगा जब संकलक चलता है। तो जवाब नहीं है, यह किसी भी स्मृति का उपयोग नहीं करता है।

4

नहीं, यह बाइनरी में नहीं होगा। इसे संकलित नहीं किया जाएगा - प्रीप्रोसेसर इसे संकलन से पहले एक खाली स्ट्रिंग में विस्तारित करेगा, इसलिए संकलक इसे भी नहीं देख पाएगा।

2

नहीं। प्रीप्रोसेसर संकलन से पहले निष्पादित किया जाता है, और इसलिए कोड कभी भी नहीं देखा जाएगा। हालांकि, मैं यह जोड़ना चाहता हूं कि यदि आप अपने सी ++ एप्लिकेशन में लॉगिंग जोड़ने में रुचि रखते हैं, तो आप Log4Cxx लाइब्रेरी का उपयोग करना चाहेंगे। यह समान मैक्रोज़ का उपयोग करता है जो आप अपने आवेदन से पूरी तरह से elide कर सकते हैं, लेकिन जब लॉगिंग सक्षम है, यह लॉगिंग के कई अलग-अलग स्तर (महत्व/गंभीरता के आधार पर) के साथ-साथ कई अलग-अलग "परिशिष्ट" का समर्थन करता है जिसमें लॉगिंग आउटपुट भेजने के लिए (उदाहरण के लिए syslog , कंसोल, फाइलें, नेटवर्क I/O, आदि)।

पूर्ण एपीआई दस्तावेज Log4Cxx API docs पर पाया जा सकता है। साथ ही, यदि आपके पास बोर्ड पर कोई जावा डेवलपर है जिसने Log4J का उपयोग किया है, तो उन्हें Log4Cxx के साथ घर पर सही महसूस करना चाहिए (और इसे उपयोग करने के लिए आपको मनाने के लिए)।

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