在C中获取调用函数的名称(不使用预处理器)

Edd*_*ett 1 c stack gcc

我想知道是否有办法在C中找到称为当前函数(在运行时)的函数.

我知道你可以__FUNCTION__在gcc中使用,但有没有办法不使用C预处理器?

可能不是.

干杯

Mic*_*hne 6

不,没有.C不是一种特别内省的语言 - 诸如函数名称(或调用堆栈的部分)之类的东西在运行时不能以任何理智的方式提供.

如果由于某种原因,您正在寻找大量工作而没有什么好处,那么您可以使用调试符号构建程序,并且可以编写堆栈遍历和调试符号查找代码.然后你可以在飞行中找到它.但要小心,因为如果你涉及到任何C++,你将在调试信息中看到的符号将用类型信息进行修饰.

你已经标记了这个帖子gcc,所以相关的细节是可用的,但这属于'不推荐'和'不保证在编译器版本之间相同'的区域.

  • 调试符号的另一个问题是,如果编译器内联函数,它们将显示不同的结果. (2认同)

Vas*_*mov 6

假设你有一个函数f(),你想知道调用者.

将该函数重命名为f_func()并定义一个打印__func__然后调用f_func()的宏f ().例:

void
f_func()
{
        do something;
}

#define f() \
        do { \
                printf("f called from %s\n", __func__); \
                f_func(); \
        } while (0)

void
a()
{
        f();
}

void
b()
{
        f();
}

int
main(int argc, char **argv)
{
        a();
        b();

        return(0);
}
Run Code Online (Sandbox Code Playgroud)