gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:12:45 24 4
gpt4 key购买 nike

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

最佳答案

这取决于您的场景。

您可以考虑预定义标识符 __func__。标准说:

The identifier __func__ shall be implicitly declared by the translator as if, immediately following the opening brace of each function definition, the declaration

static const char __func__[] = "function-name";

appeared, where function-name is the name of the lexically-enclosing function.
....

EXAMPLE Consider the code fragment:

#include <stdio.h>
void myfunc(void)
{
printf("%s\n", __func__);
/* ... */
}

Each time the function is called, it will print to the standard output stream:

myfunc

你可以用这样的宏来模仿 get_func_name:

#define print_func_name() { printf("%s\n", __func__); }

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

关于c - 如何在不查看堆栈的情况下打印出调用函数的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38134821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com