调用函数的打印名称
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 信息的能力。也许这对你有帮助。
我发现 __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 信息的能力。也许这对你有帮助。