C++ 是否可以轻松打印详细的调试输出?

C++ 是否可以轻松打印详细的调试输出?,c++,debugging,C++,Debugging,我基本上是在寻找一种自动化键入内容的方法,如下所示: cout << "a[" << x << "][" << y << "] =\t" << a[x][y] << endl; 理想情况下,这也适用于 PRINTDBG(func(arg1, arg2)); 甚至 PRINTDBG(if(condition) func(foo);); (将打印例如“if(false)func(5)”) 不可移植的黑客也欢迎:

我基本上是在寻找一种自动化键入内容的方法,如下所示:

cout << "a[" << x << "][" << y << "] =\t" << a[x][y] << endl;
理想情况下,这也适用于

PRINTDBG(func(arg1, arg2));
甚至

PRINTDBG(if(condition) func(foo););
(将打印例如“if(false)func(5)”)

不可移植的黑客也欢迎:)


(不,使用调试器是不一样的,它的灵活性要小得多,而且我发现它令人困惑)

这是一个
printf
风格输出更简洁的领域:

cout << "a[" << x << "][" << y << "] =\t" << a[x][y] << endl;
printf("a[%d][%d] =\t%d\n", x, y, a[x][y]);
但是,当用作
PRINTDBG(a[x][y])
时,它实际上会打印:

a[x][y] = 5

它没有给出
x
y

的实际值,这是不可能的。如果你有If(条件)func(foo);给定一个宏,它可以字符串化这些内容,并且它将打印if(condition)func(foo);,但不是用替换的变量的实际值。请记住,预处理器不知道该代码的结构

为了进行调试,我会使用一些类型安全的printf变体,如boost.format或一些自制软件,这使得打印类似内容的工作更加容易:

dprintf("a[%][%] = %", (x, y, a[x][y]));

我通常使用一个简单但可自定义的记录器函数,而不是宏


Log(const char *format, ...)
{
    char buffer[MAX_BUFFER_SIZE];
    va_list args;

    //get arguements into a list
    va_start(args, format);

    //printf formated arguement into a string
    vsnprintf(buffer, sizeof(buffer), format, args);

    va_end(args);

    printf("%s", buffer);
  }
所以现在你可以做了

Log(“a[%d][%d]=\t%d\n”,x,y,a[x][y])
Log(“如果(%s)函数(%d);”,(条件)?“真”:“假”,函数(foo))

在函数LOG()中添加一些loggingtype(即LOG_屏幕、LOG_文件),现在您可以控制登录的位置

添加一些日志级别(即警告、暴击),以控制其显示方式、颜色等

当然,有很多很多图书馆已经在做这类事情了


希望这有助于

在与Greg的帖子不同的方向上稍微扩展,我已经看到一些很好的C程序,看起来像这样

#DEFINE DEBUG_MODE 1
//...
if( DEBUG_MODE)
  printf("methodX() says: y=%i, var1=%i", y, var1);

但是,您的程序中仍有大量printf,但至少可以在需要时打开和关闭它们。

您可以为自定义类定义运算符«,因此只需定义一次格式:

struct point3 {
      int x,y,z;
      point3(int a, int b, int c){x=a;y=b;z=c;}
};

std::ostream& operator << (std::ostream& os, const point3& f) {
      return os << "(" << f.x << "," << f.y << "," << f.z << ")";
}

point3 p(1,2,3);
std::cout << p; // prints "(1,2,3)"
struct point3{
int x,y,z;
点3(inta,intb,intc){x=a;y=b;z=c;}
};

std::ostream和操作员谢谢。我希望你喜欢。如果您担心性能(1000000次迭代的速度大约为300ms,而printf只需要40ms),那么您可以使用这个优化的char*:。它收集字符,并一次性写入。只需要70毫秒:)它还使用一个结构,以避免再次传递结束迭代器,只传递它的类型。但在这里,这只是一个游戏,因为你用它来调试,时间并不重要。但也许你也决定用它来做其他事情。玩得开心:)
Log("a[%d][%d] =\t%d\n", x, y, a[x][y])
Log("if(%s) func(%d) ;", (condition) ? "true" : "False", func(foo))
#DEFINE DEBUG_MODE 1
//...
if( DEBUG_MODE)
  printf("methodX() says: y=%i, var1=%i", y, var1);
struct point3 {
      int x,y,z;
      point3(int a, int b, int c){x=a;y=b;z=c;}
};

std::ostream& operator << (std::ostream& os, const point3& f) {
      return os << "(" << f.x << "," << f.y << "," << f.z << ")";
}

point3 p(1,2,3);
std::cout << p; // prints "(1,2,3)"
#include <iostream>
#include <fstream>

int main() {
      std::ofstream file("log.txt");
      std::streambuf *filebuf = file.rdbuf();
      std::cout.rdbuf(filebuf);

      std::cout << "This is written to the file";

      filestr.close();
      return 0;
}