如何知道另一个函数

我想知道是否有任何方法可以知道当前执行的函数在哪里被调用,这是在什么文件和行中。 我正在使用C语言,我正在寻找类似于__FUNCTION __,__LINE__或__FILE__宏的东西。

重命名您的function

void Function(param1) { } 

 void Function_debug(param1, char * file, char * func, unsigned long line) { } 

然后#define像这样的宏:

 #define Function(param1) Function_debug(param1, __FILE__, __FUNCTION__, __LINE__) 

C本身没有任何内容可以为您提供这些信息。 您可以自己跟踪信息(在进入/退出时)或依赖于特定于平台的API来遍历调用堆栈并确定调用函数,但不是更多。

__FILE____LINE__等是预处理器宏,可以在编译时轻松扩展到正确的值。 可以从许多可能的位置调用函数,因此无法通过预处理器完成。 找出来电者的姓名将非常困难; 它涉及遍历堆栈并将地址与符号匹配。

如果你可以忍受一个小黑客,这可能会工作(未经测试):

 /* Add a called argument to your function */ void _myFunction(char *caller, int more_args) /* And define a macro that adds it automagically */ #define myFunction(a) _myFunction(__FUNCTION__, a) 

所有实现中都不支持任何可以执行所需操作的内容。 我偶尔会发现自己处于相同的情况,我需要跟踪调用者的一些方法并执行以下操作:

 #ifdef TRACKBACK int foo(int arg1, int arg2, const char * file, int line) { SEND_TO_LOG("foo", file, line); #else int foo(int arg1, int arg2) { #endif ... ... 

当然,它在通话结束时会让人头疼,所以你需要做类似的事情:

 #ifdef TRACKBACK #define TRACKING, __FILE__, __LINE__ #else #define TRACKING #endif 

然后电话:

 foo(arg1, arg2 TRACKING); //note the lack of the comma 

当其他所有方法都失败时,它就会成功。

如果你需要在运行时知道它,我认为这是不可能的。

如果您需要在调试时知道它,可以在所需的函数上放置一个断点,然后使用GDB(使用bt命令)或Vistual Studio的调试器检查当前的STACK TRACE。

这实际上有点复杂。 您最好的选择是在调试器上获得回溯,或者为您的平台找到类似于pstack的东西。 手动方式包括遍历调用堆栈并使用调试符号将其转换为文件和行。

您可以使用日志。

 #define BEGIN_FUNC(X,Y,Z) printf("Function %s Entered at line %d from file %s",X,Z,Y) #define END_FUNC(X) printf("Function %s Exited at line %d from file %s",X,Z,Y) foo() { BEGIN_FUNC(__func__,__FILE__,__LINE__); //Your code here END_FUNC(__func___FILE__,__LINE__); 

}

要么

在gdb中使用bt。 我称之为回溯。