2010-06-15 4 views
4

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

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

+0

Вы пытаетесь создать интеллектуальный регистратор или профилировщик? –

+0

Есть ли какая-то причина, по которой вы не можете просто ссылаться на функцию внутри функции, что-то вроде 'void foo() {void (* fp()); ...; fp = foo; ...} '? –

+0

Это связано с событиями таймера, которые принимают указатели функций как обратные вызовы. –

ответ

5

Это не особенно портативны, но должен работать, по крайней мере, на некоторых платформах (например, Lin ux и 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), если вам нужна скорость.

+0

Я не думаю, что переносимость имеет значение для этого вопроса, поскольку упоминались конкретные расширения gcc. Таким образом, не переносные хаки приветствуются здесь. :) Хотя, я бы, вероятно, никогда не использовал бы его, кроме как «вау» некоторых особенно занудных подчиненных. – BobbyShaftoe

+0

Это не * очень ханкий ... Просто более неясный угол API, о котором многие программисты не знают в первую очередь. –

2

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

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

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

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

+2

Конечно, я могу использовать имя функции. Мне было любопытно, есть ли способ получить указатель на функцию без явного использования имени функции. –

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

__FUNCTION__ расширяется до строки. Это приближает меня? –

+0

@pythonic: Нет, это не приближает вас к указателю. Нет стандартного способа перехода (строка, содержащая имя функции) в (указатель функции), за исключением того, что сначала создадим какую-то таблицу. –

+0

@ David: Не переносится, но они существуют. См. Мой ответ (который начинался как комментарий к вашему комментарию, но слишком долго ...:-)) –

3

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

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

Смежные вопросы