1
6
不,没有。C不是一种特别内省的语言-像函数名(或调用堆栈的片段)这样的东西在运行时根本不可用。 如果出于某种原因,您在寻找大量的工作,而没有什么好处,那么您可以使用调试符号构建程序,并且可以编写堆栈遍历和调试符号查找代码。那么你可能会在飞行中发现这一点。但是要小心,因为你在调试信息中看到的符号将被用类型信息装饰,如果你有任何C++的话。 您已经标记了这个post-gcc,所以相关的细节是可用的,但是这属于“不推荐”和“不保证编译器版本之间是相同的”领域。 |
2
6
假设您有一个函数f(),您想从中了解调用者。
将该函数重命名为f ou func(),并定义一个宏f()来打印
|
3
2
在运行时中无法获取函数名。唯一的方法是预处理器,但它的功能非常有限。 如果您有可用的调试信息,可以遍历堆栈并从调试信息中获取函数名。然而,这既不是一个健壮的解决方案,也不是一个可移植的解决方案。 |
4
1
有两个
GNU functions
允许您从backtrace中获取函数地址和名称-
|
5
1
不简短的回答是不 但是有了预处理器,可以这样做 在C中获取调用函数的名称(使用预处理器)假设您有一个函数f(),您只想从中了解调用者以进行调试。 将该函数重命名为f_func(),并定义一个宏f(),该宏调用一个打印的f版本 芬克 然后在定义调试时调用f_Func()。 在最终版本中,通过调用真正的函数f_func()来删除信息。 例子
结果是:定义调试时
从A调用
|
6
0
使用
标识符
出现在哪里
正如SteveJessop在评论中指出的那样,这不是预处理器的一部分,而是编译器的固有部分。 通过遍历堆栈并查看调试符号,很可能有方法找到这个名称。可爱,但很疯狂。 |
pickle323 · C编程:现代方法-第10章项目6-困惑 6 年前 |
Gameatro · 为什么malloc在函数内部调用时返回空指针? 6 年前 |
E. Peracchia · F#函数调用工作不正常 6 年前 |
Jorge Zazueta · 汉诺塔C++的堆栈实现 6 年前 |
adamcasey · 缓冲区溢出“攻击”中的操作序列 6 年前 |