【问题标题】:Pointer to current function指向当前函数的指针
【发布时间】:2011-03-04 04:23:45
【问题描述】:

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

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

【问题讨论】:

标签: c gcc function-pointers


【解决方案1】:

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

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

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

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

【讨论】:

  • 当然,我可以使用函数名。我很好奇是否有一种方法可以在不显式使用函数名的情况下获取函数指针。
【解决方案2】:

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

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;
}

【讨论】:

  • FUNCTION 展开为字符串。这会让我更接近吗?
  • @pythonic:不,这不会让你更接近指针。除了首先构造某种表之外,没有标准的方法可以从(包含函数名称的字符串)到(函数指针)。
  • @David:不可移植,但它们存在。请参阅我的回答(开始是对您的评论的评论,但太长了...... :-))
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    这不是特别便携,但至少应该可以在某些平台上运行(例如,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 变量中)。

    【讨论】:

    • 我不认为可移植性对这个问题很重要,因为提到了 gcc 特定的扩展。因此,这里欢迎非便携式黑客。 :) 虽然,除了让一些特别书呆子的本科生“惊叹”之外,我可能永远不会使用它。
    • 它不是非常 hacky...只是一个API的一个更晦涩的角落,许多程序员一开始并不知道。
    猜你喜欢
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多