Pointer to current function

纵饮孤独 提交于 2019-11-29 14:40:24

This isn't especially portable, but should work on at least some platforms (i.e., Linux and OSX, where I can check the documentation; it definitely doesn't work on Windows which lacks the API):

#include <dlfcn.h>

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

There are a number of other less-portable shortcuts that work on some platforms but not others. This is also not fast; cache it (e.g., in a local static variable) if you need speed.

No. In a three-letter answer. In C++ member functions you can have a "this" pointer that does something similar, but there's nothing equivalent in C.

However, since you can't define anonymous functions, there's little need for such a feature.

I realise this is likely not what you're after... but it still answers your question as it is currently phrased:

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

(Of course, here you could just as well use the identifier someFunction directly in most cases, instead of the function pointer self.)

If, however, you are looking for a means to do the same when you don't know what the current function is called (how could you ever get in such a situation, I wonder?), then I don't know a standard-compliant, portable way of doing this.

BobbyShaftoe

Looks like this has been asked before on SO, here is an interesting answer that I have not tested:

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

Anyway, there are some interesting extensions, with gcc extensions, are you familiar with the __FUNCTION__ macro?

See what you think about this (this will just get you a string with the name of the 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;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!