调用函数的打印名称

Print name of caller function

我发现 __FUNCTION__ 宏会给出当前正在执行的函数的名称,但是是否有任何宏可用于打印父函数的名称(当前调用 运行 函数的函数)?

void print_error_message(const char *msg)
{
    printf("%s : %s\n",__FUNCTION__,msg);
}

int main()
{
    print_error_message("failed to connect");
    return 0;
}

以上程序将给出输出:

print_error_message : failed to connect

但我实际需要的是

main : failed to connect

因为 main() 调用了 print_error_message()

我不想再像 print_error_message(__FUNCTION__, msg) 那样向函数 print_error_message() 传递一个参数,我期望的是一个类似的宏或函数来检索调用函数的名称。

不,不可用,也不可能。

因为像 __FUNCTION__ 这样的宏的值是在预处理阶段计算的,而你想做的事情在那个阶段是不可能的。

没有从调用堆栈中获取名称的标准方法,如果调试信息被删除或以其他方式不可用,则根本无法获取名称。

作为一个简单的解决方法,您可以使用宏:

#define print_error_message(msg) actual_print_error_message(__FUNCTION__, (msg))

void actual_print_error_message(const char *func, const char *msg)
{
    printf("%s : %s\n",func,msg);
}

注意 __FUNCTION__ 不是标准 C,它是一个扩展。为了符合标准,请使用 C99 特殊预定义变量 __func__.

您可以让调用者将其函数名称作为参数传递。例如:

void print_error_message(const char *msg, const char *caller)
{
    printf("%s : %s\n",caller,msg);
}

int main()
{
    print_error_message("failed to connect", __FUNCTION__);
    return 0;
}

I don't want to pass one more argument to function [...] I am expecting is a similar macro or function to retrieve the name of the caller function.

这不存在,至少不作为 C 标准的一部分。

开启 Linux GCC 提供拉取 backtrace 信息的能力。也许这对你有帮助。