我想创建包含info(),debug()和error()函数的log.c文件。 这些功能无需打印文件名,行号等。 因此,当我调用此函数之一时,我想转储调用者的文件名,行号和函数名。那么我们如何准确追溯? 有没有办法追溯C,或者,如果我们使用宏,怎么办呢?
答案 0 :(得分:28)
我通过参数将数据传递给函数(可能得到宏的帮助)
int info(const char *fname, int lineno, const char *fxname, ...) { /* ... */ }
int debug(const char *fname, int lineno, const char *fxname, ...) { /* ... */ }
int error(const char *fname, int lineno, const char *fxname, ...) { /* ... */ }
并称呼他们
info(__FILE__, __LINE__, __func__, ...);
debug(__FILE__, __LINE__, __func__, ...);
error(__FILE__, __LINE__, __func__, ...);
注意:__func__
是C99; gcc,在模式C89中有__FUNCTION__
答案 1 :(得分:7)
如果您使用宏,我相信您可以使用__FILE__
,__LINE__
和__FUNCTION__
来完成这项工作。例如,
#define INFO(msg) \
fprintf(stderr, "info: %s:%d: ", __FILE__, __LINE__); \
fprintf(stderr, "%s", msg);
您也可以使用函数,但是您需要传入__FILE__
等,以确保它们具有正确的值。