【问题标题】:How can I use the TRACE macro in non-MFC projects?如何在非 MFC 项目中使用 TRACE 宏?
【发布时间】:2023-03-18 23:24:01
【问题描述】:

我想在非MFC C++ 项目中使用 TRACE() 宏在Visual Studio 2005 的调试窗口中获取输出,但需要哪些额外的头文件或库?

有没有办法将消息放在调试输出窗口中,我该怎么做?

【问题讨论】:

    标签: c++ visual-c++ visual-studio-2005


    【解决方案1】:

    构建你自己的。

    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
    

    然后只需 #include "trace.h" 就可以了。

    免责声明:我只是从个人项目中复制/粘贴了这段代码,并取出了一些项目特定的东西,但没有理由它不应该工作。 ;-)

    【讨论】:

    • wvsprintf 不处理浮点数 (%f)。相反,可以使用 vsprintf。
    • 对于 Linux C++,我用#include &lt;stdarg.h&gt;#include &lt;cstdio&gt; 修改了你的代码,用vsnprinf 替换了wvsprinf。然后将OutputDebugString 替换为std::clog &lt;&lt; buffer &lt;&lt; std::flush;
    • 在发布版本中,Visual Studio 会为每个 TRACE 事件生成警告 C4013(警告级别 3)和警告 C4555(警告级别全部)。为了防止出现警告,我将false &amp;&amp; _trace 部分更改为__noop。这也是 MFC 的做法。
    【解决方案2】:

    如果你使用 ATL,你可以试试 ATLTRACE。

    在 afx.h 中将 TRACE 定义为(至少在 vs 2008 中):

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

    而 ATLTRACE 可以在 atltrace.h 中找到

    【讨论】:

    • 我想使用这种方法,但是对于非 ATL 的项目,还有一些额外的 ATL 包袱。我正在使用带有窗口窗体的 C++/CLI 并添加 atltrace.h 包含导致编译器错误,所以我采用了仅使用 OuputDebugString() 的方法,因为我只有几个文本字符串要在不同的地方输出。
    【解决方案3】:

    您可以尝试 DebugOutputString 函数。 TRACE 仅在调试版本中启用。

    【讨论】:

      【解决方案4】:

      据我了解,wvsprintf 的格式有问题。改用 _vsnprintf (或 thcar 版本 _vsntprintf )

      【讨论】:

        【解决方案5】:

        感谢这些答案,我已经修复了我的错误 :-)

        在这里,我根据 Ferruccio 和热心极客的想法分享我的 C++ 中的 TRACE 宏。

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

        欢迎任何改进/建议/贡献;-)

        【讨论】:

        • 尝试使用时出错:错误(活动)E2140 表达式必须具有整数或无范围枚举类型
        【解决方案6】:

        我在网上看到了以下内容: #define TRACE printf

        稍微开发一下,得出以下结论:

        #ifdef _DEBUG
        #define TRACE printf
        #else
        #define TRACE 
        #endif
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-21
          • 2010-09-06
          • 2011-02-08
          • 1970-01-01
          • 1970-01-01
          • 2023-03-14
          相关资源
          最近更新 更多