代码之家  ›  专栏  ›  技术社区  ›  Iraimbilanja

轻松打印详细的调试输出?

  •  3
  • Iraimbilanja  · 技术社区  · 17 年前

    我基本上是在寻找一种自动键入以下内容的方法:

    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)”)。

    也欢迎非门户黑客:)

    (不,使用调试器是不一样的,它的灵活性要低得多,我觉得很困惑)

    5 回复  |  直到 17 年前
        1
  •  2
  •   Greg Hewgill    17 年前

    按照你想要的方式,这是不可能的。如果你有 if(condition)func(foo); 给一个宏,它可以把这些东西串起来,然后打印出来 if(condition)func(foo); ,但不替换变量的实际值。记住,预处理器不知道该代码的结构。

    为了调试,我会使用一些类型安全的printf变体,如boost.format或一些自制的 printf with boost.fusion ,这使得打印这样的东西变得更加容易:

    dprintf("a[%][%] = %", (x, y, a[x][y]));
    
        2
  •  2
  •   Community Mohan Dere    9 年前

    这是一个区域 printf 样式输出可以更简洁:

    cout << "a[" << x << "][" << y << "] =\t" << a[x][y] << endl;
    printf("a[%d][%d] =\t%d\n", x, y, a[x][y]);
    

    当然,这有局限性,只适用于以下类型 输出函数 理解,但它仍然没有解决你的问题。

    我觉得Boost中的表达式分解技术可能有一些价值,但我还不足以成为一个模板忍者来识别什么。

    更新 以下内容几乎回答了你的问题:

    #define PRINTDBG(x) cout << #x << " =\t" << x << endl;
    

    然而,当用作 PRINTDBG(a[x][y]) 它从字面上打印:

    a[x][y] = 5
    

    这没有给出以下值的实际值 x y .

        3
  •  0
  •   Tree77    17 年前

    我通常使用简单但可定制的记录器功能,而不是宏

    
    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))

    在函数LOG()中添加一些日志类型(即LOG_SCREEN、LOG_FILE),现在您可以控制它被记录到哪里

    添加一些日志级别(即警告、CRIT)来控制其显示方式、颜色等。

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

    希望这有帮助

        4
  •  0
  •   rlb.usa    17 年前

    与Greg的帖子方向不同,我看到了一些不错的C程序,看起来像这样

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

    然而,你的程序中仍然有大量的printf,但至少你可以在想的时候打开和关闭它们。

        5
  •  0
  •   Dustin Getz sunsations    17 年前

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

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