转自:http://www.voidcn.com/article/p-ruuoijoc-mn.html
之前有看到一篇帖子,帖子内容如下:
/*******************************原文************************/
引自:http://bbs.youkuaiyun.com/topics/370006942
linux系统下C语言写了一个函数,我想在这个函数里面打印出调用这个函数的文件的文件名和调用所在行的行号。
请不要告诉我用__FILE__和__LINE__宏,他们只能得到自己所在的文件名和行号,无法得到调用方的文件名和行号。
比如:
file1.c
1
2
3
4
|
void
my_fun()
{
/*打印file2.c的文件名和行号(这里应该为5)*/
}
|
file2.c
1
2
3
4
5
6
7
|
extern
void
my_fun();
int
main()
{
my_fun();
return
0;
}
|
谢谢!!!
原贴有人提出了解决方法,但不是很细,新手可能还是比较迷茫,借鉴规整如下:
方法1、使用传参数的方法,重新封装
my_fun(const char* file, int line);
调用为:my_fun(__FILE__, __LINE__);
但是这种方法每次调用都要传参数比较繁琐,原文中根据作者的需求,也是不能传参的;
方法2、重新封装my_fun函数;
void my_fun(const char* __file__, int __line__);
在全局参数的头文件中定义如下:
#define __my_fun__() my_fun(__FILE__, __LINE__)
调用为:__my_fun__();
这样就实现了原文作者最初的目的,linux下C语言如何得到调用我的函数的文件名和行号。
需要说明的是,如果直接封装
my_fun(){
printf("file = '%s', line = %d\r\n", __FILE__, __LINE__);
}
在其它文件中直接调用my_fun,则打印的永远是my_fun函数所在的文件名称和行号;
方法2实现的原理就是预编译,编译器在编译的时候直接将调用my_fun的__FILE__和__LINE__传递给了my_fun(__FILE__, __LINE__);