在以下代码中,get_func_name()
可以是系统调用,库调用或我自己定义的函数。如果不使用任何参数,我怎样才能让get_func_name()
打印掉调用函数的名称,而不使用堆栈中的信息?
此外,除了来电者的姓名外,我可以在get_func_name()
打印出能够唯一识别来电者的任何内容吗?
void get_func_name(){
/*What magic goes here?*/
}
void func2(){
func3();
get_func_name(); /*Should print out "func2()"*/
}
void func1(){
func2();
get_func_name(); /*Should print out "func1()"*/
}
void main(){
func1();
get_func_name(); /*Should print out "main()"*/
}
答案 0 :(得分:2)
这取决于您的情况。
您可以考虑预定义的标识符__func__
。标准说:
标识符
__func__
应由翻译者隐式声明,如果, 紧跟在每个函数定义的左大括号后面的声明static const char __func__[] = "function-name";
出现,其中function-name是词法封闭函数的名称。
....
示例考虑代码片段:
#include <stdio.h> void myfunc(void) { printf("%s\n", __func__); /* ... */ }
每次调用该函数时,它都将打印到标准输出流:
myfunc
你可以用这样的宏来模仿get_func_name
:
#define print_func_name() { printf("%s\n", __func__); }
但是,如果您的任务不同并且您希望在一般情况下调用者的名称,那么我认为没有检查堆栈就无法获得它。 (即使您可以访问堆栈,也需要一些调试信息来将呼叫者的地址映射到呼叫者的姓名。)