Указатель на текущую функцию - PullRequest
4 голосов
/ 16 июня 2010

Есть ли способ получить указатель на текущую функцию, возможно, с помощью расширений gcc или какой-то другой хитрости?

Редактировать Мне любопытно, возможно ли получить указатель на функцию без явного использования имени функции. Я подумал, что у меня есть веская причина для этого, понял, что на самом деле этого не сделал, но мне все еще интересно, возможно ли это.

Ответы [ 4 ]

5 голосов
/ 16 июня 2010

Это не особенно переносимо, но должно работать по крайней мере на некоторых платформах (например, Linux и OSX, где я могу проверить документацию; это определенно не работает в Windows, где отсутствует API):

#include <dlfcn.h>

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

Существует ряд других менее переносимых ярлыков, которые работают на некоторых платформах, но не на других. Это тоже не быстро; кэшируйте его (например, в локальной переменной static), если вам нужна скорость.

3 голосов
/ 16 июня 2010

Нет.В трехбуквенном ответе.В функциях-членах C ++ у вас может быть указатель «this», который делает что-то похожее, но нет ничего эквивалентного в C.

Однако, поскольку вы не можете определить анонимные функции, такая возможность не требуется.

2 голосов
/ 16 июня 2010

Я понимаю, что это, вероятно, не то, что вы ищете ... но он все еще отвечает на ваш вопрос, как это в настоящее время сформулировано:

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

(Конечно, здесь вы также можете использовать идентификатор someFunction напрямую в большинстве случаев вместо указателя функции self.)

Если, однако, вы ищете способ сделать то же самое, когда вы не знаете, как вызывается текущая функция (интересно, как вы можете попасть в такую ​​ситуацию?), Тогда я не знать стандартный совместимый, портативный способ сделать это.

0 голосов
/ 16 июня 2010

Похоже, об этом уже спрашивали на SO, вот интересный ответ, который я не проверял:

Получить указатель на текущую функцию в 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;
}
...