我基本上正在寻找一种自动输入内容的方法,如下所示:
cout << "a[" << x << "][" << y << "] =\t" << a[x][y] << endl;
类似的东西:
PRINTDBG(a[x][y]);
理想情况下,这也适用于
PRINTDBG(func(arg1, arg2));
甚至
PRINTDBG(if(condition) func(foo););
(将打印例如“if(false)func(5)”)。
非便携式黑客也欢迎:)
(不,使用调试器不一样,它的灵活性要差得多,我发现它很混乱)
答案 0 :(得分:2)
这是printf
样式输出可以更简洁的区域:
cout << "a[" << x << "][" << y << "] =\t" << a[x][y] << endl;
printf("a[%d][%d] =\t%d\n", x, y, a[x][y]);
当然,这仅限于printf
理解的类型,但仍然无法解决您的问题。
我觉得Boost中的表达式分解技术可能有一些有价值的东西,但我还不足以识别模板忍者。
更新:以下几乎解决了您的问题:
#define PRINTDBG(x) cout << #x << " =\t" << x << endl;
但是,当用作PRINTDBG(a[x][y])
时,它会打印出来:
a[x][y] = 5
未提供x
和y
的实际值。
答案 1 :(得分:2)
这是你想要的方式,不可能。如果你给宏指定了 if(condition)func(foo); ,它可以对那些东西进行字符串化,它会打印 if(condition)func(foo); ,但不是替换变量的实际值。请记住,预处理器不了解该代码的结构。
对于调试,我会使用一些类型安全的printf变体,如boost.format或一些家庭酿造printf with boost.fusion,这使得打印这样的东西更容易:
dprintf("a[%][%] = %", (x, y, a[x][y]));
答案 2 :(得分:0)
我通常使用简单但可自定义的记录器功能而不是宏
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("if(%s) func(%d) ;", (condition) ? "true" : "False", func(foo))
将一些loggingtype(即LOG_SCREEN,LOG_FILE)添加到函数Log()中,现在您可以控制记录到哪里
添加一些logginglevel(即WARN,CRIT)来控制它的显示方式,颜色等。
当然,有很多很多图书馆已经完成了所有类型的工作
希望这会有所帮助
答案 3 :(得分:0)
在与Greg发布的不同方向略有扩展时,我看到了一些看起来像这样的好C程序
#DEFINE DEBUG_MODE 1
//...
if( DEBUG_MODE)
printf("methodX() says: y=%i, var1=%i", y, var1);
但是你的程序中仍然有大量的printf,但至少你可以随时打开和关闭它们。
答案 4 :(得分:0)
您可以为自定义类定义运算符«因此您只需要定义一次格式:
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)"
这很适合将cout或clog重定向到文件(不记得std :: clog是如何工作的)
#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;
}