如何知道另一个函数

时间:2010-07-26 18:36:13

标签: c file function macros line

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

7 个答案:

答案 0 :(得分:12)

重命名您的功能

void Function(param1)
{
}

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

然后#define像这样的宏:

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

__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)

答案 3 :(得分:1)

在所有实现中都没有任何支持可以执行您想要的操作。我偶尔会发现自己处于同样的情况,我需要跟踪呼叫者的一些方法并执行以下操作:

#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

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

答案 4 :(得分:0)

如果您需要在运行时了解它,我认为不可能。

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

您可以使用日志。

#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__);

}

OR

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