2009-01-30 13 views
24

मैं Visual Studio 2005 में डीबग विंडो में आउटपुट प्राप्त करने के लिए TRACE() मैक्रो का उपयोग गैर-MFC सी ++ प्रोजेक्ट में करना चाहता हूं, लेकिन अतिरिक्त हेडर या लाइब्रेरी की आवश्यकता है?मैं गैर-एमएफसी परियोजनाओं में TRACE मैक्रो का उपयोग कैसे कर सकता हूं?

क्या डीबग आउटपुट विंडो में संदेश डालने का कोई तरीका है और मैं यह कैसे कर सकता हूं?

उत्तर

26

में पाया जा सकता अपने खुद के बनाएँ।

trace.cpp:

#ifdef _DEBUG 
bool _trace(TCHAR *format, ...) 
{ 
    TCHAR buffer[1000]; 

    va_list argptr; 
    va_start(argptr, format); 
    wvsprintf(buffer, format, argptr); 
    va_end(argptr); 

    OutputDebugString(buffer); 

    return true; 
} 
#endif 

trace.h:

#include <windows.h> 
#ifdef _DEBUG 
bool _trace(TCHAR *format, ...); 
#define TRACE _trace 
#else 
#define TRACE false && _trace 
#endif 

तो बस "trace.h" # शामिल है और आप पूरी तरह तैयार हैं।

अस्वीकरण: मैंने इस कोड को एक निजी परियोजना से प्रतिलिपि/चिपकाया और कुछ परियोजना विशिष्ट सामान निकाले, लेकिन ऐसा कोई कारण नहीं है कि इसे काम नहीं करना चाहिए। ;-)

+0

wvsprintf फ़्लोटिंग पॉइंट नंबर (% f) को संभाल नहीं करता है। इसके बजाय, vsprintf का उपयोग किया जा सकता है। – JcMaco

+2

लिनक्स सी ++ के लिए, मैंने आपके कोड को '#include ', '# शामिल करें ' के साथ संशोधित किया, 'vsnprinf' के साथ 'wvsprinf' को प्रतिस्थापित किया। फिर 'आउटपुटडिबगस्ट्रिंग' को 'std :: clog << buffer << std :: flush;' के साथ बदल दिया गया। – enthusiasticgeek

+3

रिलीज में, विजुअल स्टूडियो एक चेतावनी C4013 (चेतावनी स्तर 3) उत्पन्न करता है और प्रत्येक TRACE घटना के लिए चेतावनी C4555 (चेतावनी स्तर सभी) भी उत्पन्न करता है। चेतावनियों को रोकने के लिए, मैंने 'false && _trace' भाग को '__noop' ​​में बदल दिया। एमएफसी यह भी करता है। –

3

आप DebugOutputString फ़ंक्शन को आजमा सकते हैं। ट्रैक केवल डीबग बिल्ड में सक्षम है।

7

यदि आप एटीएल का उपयोग करते हैं तो आप ATLTRACE को आजमा सकते हैं।

ट्रेस के रूप में (कम से कम में बनाम 2008) afx.h में परिभाषित किया गया है:

// extern ATL::CTrace TRACE; 
#define TRACE ATLTRACE 

और ATLTRACE atltrace.h

+0

मैं इस इस दृष्टिकोण का उपयोग करना चाहता था लेकिन वहाँ कुछ अतिरिक्त ATL सामान उस के लिए इस के साथ आता है एक परियोजना जो एटीएल नहीं है। मैं विंडो फॉर्म के साथ सी ++/सीएलआई के साथ काम कर रहा हूं और 'atltrace.h' को जोड़कर कंपाइलर त्रुटियों को शामिल कर रहा हूं, इसलिए मैंने केवल 'OuputDebugString()' का उपयोग करने का दृष्टिकोण लिया क्योंकि मेरे पास विभिन्न स्थानों पर आउटपुट करने के लिए कुछ टेक्स्ट स्ट्रिंग हैं। –

1

मेरी समझ में wvsprintf स्वरूपण के साथ समस्या है। इन उत्तरों मैं अपने बग तय कर दी है के लिए _vsnprintf (या thcar संस्करण _vsntprintf) के बजाय

1

धन्यवाद का उपयोग करें :-)

यहाँ मैं सी में मेरी ट्रेस मैक्रो ++ फारुशियो और enthusiasticgeek से विचारों के आधार पर साझा करें।

#ifdef ENABLE_TRACE 
# ifdef _MSC_VER 
# include <windows.h> 
# include <sstream> 
# define TRACE(x)       \ 
    do { std::stringstream s; s << (x);  \ 
      OutputDebugString(s.str().c_str()); \ 
     } while(0) 
# else 
# include <iostream> 
# define TRACE(x) std::clog << (x) 
# endif  // or std::cerr << (x) << std::flush 
#else 
# define TRACE(x) 
#endif 

उदाहरण:

#define ENABLE_TRACE //can depend on _DEBUG or NDEBUG macros 
#include "my_above_trace_header.h" 

int main (void) 
{ 
    int  v1 = 123; 
    double v2 = 456.789; 
    TRACE ("main() v1="<< v1 <<" v2="<< v2 <<'\n'); 
} 

किसी भी सुधार/सुझाव/योगदान स्वागत है ;-)

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