2016-09-11 1 views
0

Это мой сниппет:с, как оценить указатель функции, используя имя функции

typedef void (*FUNCPT)(void); 

void func1(); 

int main(){ 
    FUNCPT fpt1; 
    char *s = "func1"; 

    return 0; 
} 

я могу оценить fpt1 так:

fpt1 = func1; 

Но есть причина, по которой я должен использовать имя функции для оценивать указатель на функцию, я ожидаю получить такую ​​же ценность примерно следующим образом:

fpt1 = (FUNCPT)s; 

Как я могу добиться этого?

+0

Будет ли справочная таблица решением? – 4386427

+0

Прекрасные решения, которые используют таблицу и '#'. – chux

ответ

1

Я не думаю, что есть какой-либо переносной способ сделать это. Я думаю, вам нужно написать свой собственный код для этого. Например, справочная таблица, например:

#include <stdio.h> 

void func1() {printf("func1\n");} 
void func2() {printf("func2\n");} 
void func3() {printf("func3\n");} 

typedef void (*FUNCPT)(void); 

typedef struct lookup 
{ 
    FUNCPT f; 
    char name[32]; 
} lookup; 

lookup lookup_table[] = { 
    {func1, "func1"}, 
    {func2, "func2"}, 
    {func3, "func3"}, 
}; 

FUNCPT getFuncByName(char* str) 
{ 
    int i; 

    for (i=0; i < (sizeof(lookup_table)/sizeof(lookup)); ++i) 
    { 
     if (strcmp(str, lookup_table[i].name) == 0) return lookup_table[i].f; 
    } 
    return NULL; 
} 
int main(){ 
    FUNCPT fpt = getFuncByName("func2"); 

    if (fpt) fpt(); 

    return 0; 
} 
+0

благодарю вас за код, но я не хочу, чтобы таблица поиска вручную, возможно ли это? –

+0

@ D.Bear - В стандарте C (насколько мне известно) нет способа получить указатель на функцию из исходного кода функции. Вам придется закодировать свою собственную функцию nameToFunctionPointer. – 4386427

+0

@ D.Bear BTW - Вы можете легко создать скрипт/программу, которая сканировала вашу базу кода и автоматически создала справочную таблицу. Таким образом, вам не нужно будет поддерживать его вручную. – 4386427

2

Единственный способ оценить имя функции на указатель функции (без ссылки на фиксированную таблицу символов и имен в вашем собственном коде) - это использование разделяемых библиотек и dlopen(), dlsym() и подобных в мире Linux/Unix и соответствующие эквиваленты в мире Windows.

  1. Помещенный функции, которые вы хотите разрешить в разделяемую библиотеку
  2. Open, совпадающую библиотеку из программы с помощью dlopen
  3. Найдите символ по имени, используя dlsym
  4. Cast, что возвращаемый адрес в соответствующую функцию указатель и назовите его

Это, однако, более ОС, чем вопрос С. Без указания вашей платформы дальнейшая помощь невозможна.

+0

Большое спасибо, я работаю над AIX. Вы даете мне ключ –

+0

@ D.Bear Примите мои симпатии. AIX, вероятно, является операционной системой unixoid с наибольшим количеством динамических библиотечных причуд, с которыми я когда-либо сталкивался ... Убедитесь, что вы знаете, что делает «slibclean». – tofro

+0

haha, thanks.I будет google slibclean –

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