调试流。(C ++)

时间:2017-03-18 17:15:51

标签: c++ debugging ofstream

我需要创建一个调试ofstream,其功能如下:

#define DEBUG true

int main() {
    debug << "Hello World\n";
}

上述情况中的输出应为:Hello World

以下代码 -

#define DEBUG false

int main() {
    debug << "Hello World\n";
}

输出应为空。 任何建议我应该如何进行。

2 个答案:

答案 0 :(得分:0)

正如我从您的问题中所理解的那样,您希望有一个单独的调试流(与std::coutstd:cerr相反)。 你可以通过制作一个&#34; null流来实现这一目标。只是吃掉一切,什么都不做。

如果您的编译器足够聪明,那么它最终应该删除大部分内容。

class NullStream {};

template<typename T>
NullStream& operator<<(NullStream& s, T const &) { return s; }

NullStream& operator<<(NullStream& s, std::ostream&(std::ostream&)) { return s; }

现在,根据您的宏,您决定是使用NullStream还是使用实际ostringstream

#if DEBUG
std::ostringstream debug;
#else
NullStream debug;
#endif

像这样测试:

debug << "Hello World\n";
debug << 12345 << "\n";
debug << "Test" << std::endl;

#if DEBUG
std::cout << "Debug:" << std::endl;
std::cout << debug.str() << std::endl;
#endif

如果DEBUG不是0,则会产生:

  

调试:

     

Hello World

     

12345

     

测试

请注意,NullStream本身并没有任何std::ostream的功能,因此另一种解决方案可能是从std::ostream派生并丢弃任何输入接收。

答案 1 :(得分:0)

根据您的使用情况,我认为debug需要是宏观的,因为没有其他方法可以获取DEBUG的值。一个简单的定义是:

#define debug (debugstream << enable<DEBUG>)
extern std::ostream debugstream;
template <bool Enable>
std::ostream& enable(std::ostream& out) {
    if (Enable) {
        out.clear();
    }
    else {
        out.setstate(std::ios_base::badbit);
    }
    return out;
}
std::ostream debugstream(std::cout.rdbuf()); // probably defined in a separate translation unit

这里的技巧是使用流的starte来启用/禁用输出的打印:当流未处于良好状态时,无法生成输出(通过正确编写的输出运算符),即,{{1 }}或std::ios_base::failbit已设置。可以通过使用std::ios_base::badbit设置/取消设置流缓冲区来强制执行此行为。