2009-01-30 6 views

Trả lời

26

Xây dựng của riêng bạn.

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 

sau đó chỉ cần #include "trace.h" và bạn đã cài đặt xong.

Tuyên bố từ chối trách nhiệm: Tôi chỉ sao chép/dán mã này từ một dự án cá nhân và lấy ra một số nội dung cụ thể của dự án, nhưng không có lý do gì nên không hoạt động. ;-)

+0

wvsprintf không xử lý số dấu phẩy động (% f). Thay vào đó, vsprintf có thể được sử dụng. – JcMaco

+2

Đối với Linux C++, tôi đã sửa đổi mã của bạn bằng '#include ', '#include ', thay thế 'wvsprinf' bằng' vsnprinf'. Sau đó thay thế 'OutputDebugString' bằng' std :: clog << buffer << std :: flush; '. – enthusiasticgeek

+3

Trong bản phát hành, Visual Studio tạo cảnh báo C4013 (mức cảnh báo 3) và cũng cảnh báo C4555 (mức cảnh báo tất cả) cho mỗi lần xuất hiện TRACE. Để ngăn chặn các cảnh báo, tôi đã thay đổi phần 'false && _trace' thành' __noop'. Đây cũng là cách MFC thực hiện nó. –

3

Bạn có thể thử hàm DebugOutputString. TRACE chỉ được bật trong các bản dựng gỡ lỗi.

7

Nếu bạn sử dụng ATL, bạn có thể thử ATLTRACE.

TRACE được định nghĩa trong afx.h như (ít nhất là trong vs 2008):

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

Và ATLTRACE có thể được tìm thấy trong atltrace.h

+0

Tôi muốn sử dụng này phương pháp này tuy nhiên có một số bổ sung ATL hành lý mà đi kèm cùng với điều này cho một dự án không phải là ATL. Tôi đang làm việc với C++/CLI với Window Forms và thêm 'atltrace.h' bao gồm các lỗi trình biên dịch vì vậy tôi đã sử dụng phương thức' OuputDebugString() 'vì tôi chỉ có một vài chuỗi văn bản để xuất ra ở nhiều nơi khác nhau. –

1

Trong wvsprintf hiểu biết của tôi có vấn đề với định dạng. Sử dụng _vsnprintf (hoặc thcar phiên bản _vsntprintf) thay vì

1

Nhờ những câu trả lời tôi đã cố định lỗi của tôi :-)

Ở đây tôi chia sẻ vĩ mô TRACE của tôi trong C++ dựa trên ý tưởng từ Ferruccio và 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 

dụ:

#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'); 
} 

Bất kỳ cải tiến/đề xuất/đóng góp đều được chào đón ;-)