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;
}