知道程序执行的确切行

时间:2017-12-10 13:09:56

标签: c file debugging logging line-numbers

我正在尝试为我的程序执行调试模式,在一个文件中写入这样的内容来存储日志:

  

[Day Month D HH:MM:SS YYYY] foo.c function_name第33行:事情   发生了什么

问题是知道行的确切值,显然我可以在我的IDE中看到它,但我想知道是否存在更优雅和有效的方式。

我希望你能很好地解释我(对不起),并提前致谢。

1 个答案:

答案 0 :(得分:2)

您可以查看宏assertassert.h),按照您的意图完成。

简而言之:

  1. 它必须是一个宏。如果它是一个函数,它将报告该函数的文件和行,但实际上你需要调用函数的文件和行。 (这并不意味着此宏不能将函数称为帮助程序。)

  2. __FILE____LINE__可以访问当前文件和行。

  3. 所以这就是它在源代码中的样子:

    #define LOG_DEBUG(TEXT) log_debug(__FILE__, __LINE__, TEXT)
    
    void log_debug(const char *file, int line, const char *text)
    {
      fprintf(stderr, "DEBUG '%s':%d: %s\n");
    }
    

    作为MCVE test-log-debug.c

    #include <stdio.h>
    
    #define LOG_DEBUG(TEXT) log_debug(__FILE__, __LINE__, TEXT)
    
    void log_debug(const char *file, int line, const char *text)
    {
      fprintf(stderr, "DEBUG '%s':%d: %s\n", file, line, text);
    }
    
    /* test/sample */
    int main()
    {
      LOG_DEBUG("in main()");
      return 0;
    }
    

    在Windows 10(64位)的cygwin中使用gcc进行编译和测试:

    $ gcc --version
    gcc (GCC) 6.4.0
    
    $ gcc -std=c11 -g -o test-log-debug test-log-debug.c 
    
    $ ./test-log-debug     
    DEBUG 'test-log-debug.c':13: in main()
    
    $
    

    再次在Windows 10上的VS2013中进行编译和测试:

    DEBUG 'C:\Users\Scheff\tests\test-log-debug.c':13: in main()
    

    visibleman注意到有一个非常相似的问题SO: Visual C++ equivalent of __FILE__ , __LINE__ and __PRETTY_FUNCTION__

    AFAIK,(也在答案中提及)__FILE____LINE__是标准的。其他/类似的宏可能作为编译器的专有扩展提供。