我正在尝试为我的程序执行调试模式,在一个文件中写入这样的内容来存储日志:
[Day Month D HH:MM:SS YYYY] foo.c function_name第33行:事情 发生了什么
问题是知道行的确切值,显然我可以在我的IDE中看到它,但我想知道是否存在更优雅和有效的方式。
我希望你能很好地解释我(对不起),并提前致谢。
答案 0 :(得分:2)
您可以查看宏assert
(assert.h
),按照您的意图完成。
简而言之:
它必须是一个宏。如果它是一个函数,它将报告该函数的文件和行,但实际上你需要调用函数的文件和行。 (这并不意味着此宏不能将函数称为帮助程序。)
宏__FILE__
和__LINE__
可以访问当前文件和行。
所以这就是它在源代码中的样子:
#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__
是标准的。其他/类似的宏可能作为编译器的专有扩展提供。