如何在不查看堆栈的情况下打印出调用函数的名称?

时间:2016-06-30 23:28:01

标签: c

在以下代码中,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()"*/
}

1 个答案:

答案 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__); }

但是,如果您的任务不同并且您希望在一般情况下调用者的名称,那么我认为没有检查堆栈就无法获得它。 (即使您可以访问堆栈,也需要一些调试信息来将呼叫者的地址映射到呼叫者的姓名。)