您可以查看宏 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");
}
作为MCVEtest-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__ 是标准的。可能会提供其他/类似的宏作为编译器的专有扩展。