指向当前功能的指针

时间:2010-06-15 20:11:06

标签: c gcc function-pointers

有没有办法获得指向当前函数的指针,可能是通过gcc扩展或其他一些技巧?

编辑我很好奇是否有可能在没有明确使用函数名称的情况下获取函数指针。我以为我有充分的理由想要这个,意识到我并不是真的,但我仍然很好奇,如果可能的话。

4 个答案:

答案 0 :(得分:5)

这不是特别便携,但至少应该在某些平台上工作(例如Linux和OSX,我可以检查文档;它肯定不适用于缺少API的Windows):

#include <dlfcn.h>

// ...
void *handle = dlopen(NULL, RTLD_LAZY);
void *thisfunction = handle ? dlsym(handle, __FUNCTION__) : NULL;
if (handle) dlclose(handle); // remember to close!

还有许多其他不太便携的快捷方式可以在某些平台上运行,但在其他平台上则不然。这也不快;如果您需要速度,请将其缓存(例如,在本地static变量中)。

答案 1 :(得分:3)

没有。在一个三个字母的答案。在C ++成员函数中,您可以使用“this”指针执行类似的操作,但在C中没有任何等效项。

但是,由于您无法定义匿名函数,因此几乎不需要这样的功能。

答案 2 :(得分:2)

我意识到这可能不是你所追求的......但它仍然回答你的问题,因为它目前的措辞:

void someFunction()
{
    void (*self)() = someFunction;
}

(当然,在大多数情况下,您也可以直接使用标识符someFunction,而不是函数指针self。)

但是,如果你正在寻找一种方法来做同样的事情,当你不知道当前的函数被调用时(你怎么会遇到这种情况,我想知道?),那么我不知道我们知道这是一种符合标准的可移植方式。

答案 3 :(得分:0)

在SO之前看起来这个问题,这是一个我没有测试的有趣答案:

Get a pointer to the current function in C (gcc)?

无论如何,有一些有趣的扩展,有了gcc扩展,你熟悉__FUNCTION__宏吗?

看看你对此的看法(这只会给你一个带有函数名称的字符串:

#include <stdio.h>
#include <stdlib.h>


void printme(char *foo)
{
    printf("%s says %s\n", __FUNCTION__, foo);
}


int main(int argc, char *argv[])
{

    printme("hey");

    return 0;
}