Pointer to current function

前端 未结 4 1224
难免孤独
难免孤独 2020-12-19 13:06

Is there any way to get a pointer to the current function, maybe through gcc extensions or some other trickery?

Edit I\'m curious whether it is poss

相关标签:
4条回答
  • 2020-12-19 13:11

    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.

    0 讨论(0)
  • 2020-12-19 13:21

    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.

    0 讨论(0)
  • 2020-12-19 13:25

    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;
    }
    
    0 讨论(0)
  • 2020-12-19 13:34

    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.

    0 讨论(0)
提交回复
热议问题