科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件模拟TRACE: 在UI下将调试信息导向控制台(2)

模拟TRACE: 在UI下将调试信息导向控制台(2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

前篇实现了一个stream buffer, 该类主要作用我想还是在UI程序中作为调试工具用吧,可以替代TRACE宏,以在非调试状态下也能够得到trace出来的信息,然而要像TRACE一样的话,至少还有工作要做。

作者:赵宇龙 来源:CSDN 2008年3月21日

关键字: Trace 模拟 C++ C Linux

  • 评论
  • 分享微博
  • 分享邮件

仍是前一篇的内容,作些补充。

前篇实现了一个stream buffer,可以以下面方式在UI程序下使用 :

console_buffer* buffer = console_buffer::instance();

cout.rdbuf(buffer);

cout << "hellow world" << endl;

该类主要作用我想还是在UI程序中作为调试工具用吧,可以替代TRACE宏,以在非调试状态下也能够得到trace出来的信息,然而要像TRACE一样的话,至少还有工作要做。

首先,在能够输出信息之前仍然需要调用

console_buffer* buffer = console_buffer::instance();

cout.rdbuf(buffer);

以初始化cout,并产生控制台窗口。

第二,在release版本下,无法自动使代码失效,要想去掉这些控制台输出,必须手工注释掉所有相关代码。

很显然,这些是作为一个TRACE模仿代码的分内之事,因此,在这里再给出解决方法。

完美的解决方法,应该是仍然保持一个源代码文件,然而不幸得很,目前还没有想出办法来。因为作为头文件,可能被包含进多个cpp文件中,而诸如console_buffer::instance();这样的动作,如果包含进多个cpp内,那编译器会毫不犹豫地执行多次。

首先是头文件的更改

#ifndef console_buffer_h
#define console_buffer_h

#ifndef _DEBUG
#define cs /##/
#else

#include <streambuf>

namespace std{
 template<class charT, class traits = char_traits<charT> >
 class console_buf : public basic_streambuf<charT, traits>
 {
 ...

 };

 template<class charT, class traits>
 HANDLE console_buf<charT, traits>::handle;

 typedef console_buf<char> console_buffer;
}

extern std::ostream out;
#define cs out

#endif
#endif

主要做了两件事,一个是前置声明了一个std::ostream 对象,以替换正规的cout, 作为标准对象,cout有其自己固有的buffer,虽然可以通过rdbuf进行替换,然而如果不在以后恢复默认缓冲,则cout很有可能不能够正确清除,自然,在UI程序debug阶段,即便出错也无所谓,然而至少不是完善的方法。

第二件事就是定义了 cs 宏,在release下,使其展开为 //, 正是标准c注释语法,如果debug下则展开为该ostream对象,如此以来

cs << 123 << endl;

在debug下展开为 out << 123 << endl;

在release下展开为 // << 123 << endl;

这就解决了release下的调试代码自动清除问题.

再看看新增加的cpp文件

#include "stdafx.h"

#ifdef _DEBUG

#include <ostream>
#include "console_buffer.h"
using namespace std;

console_buffer* buffer = console_buffer::instance();
ostream out(buffer);

#endif


不干别的,就是产生一个ostream对象和一个console_buffer对象,并进行初始化。

由于头文件内有前置声明,因此不需要其他地方进行对象的声明,在工程中加入这两个文件后,只要在自己cpp包含了该头文件,就可以直接使用

cs << 123 << "hellow world!" << endl;

了,这种用法我感觉比

TRACE("%s %d", "hellow world!", 123);

更方便些。
 

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章