Вызов функции из строки в C - PullRequest
1 голос
/ 04 мая 2011

В C, как вы вызываете функцию, просто имея имя в виде строки? У меня есть это:

int main(int argc, const char *argv[])
{
    char* events[] = {
        "test",
        "test2"
    };

    int i = 0;
    for (; i < 2; ++i){
        char* event = events[i];
        // call function with name of "event"
    }
    return 0;
}

Ответы [ 5 ]

5 голосов
/ 04 мая 2011

Вы можете сделать это, но не так много встроенных, чтобы помочь.

typedef struct { 
    char *event_name;
    void (*handler)();
} event_handler;

затем выполните поиск по массиву (или какому-либо другому) из event_handler s, а когда найдете правильное имя, вызовите связанную функцию.

4 голосов
/ 04 мая 2011

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

Установите таблицу структур строк и указателей на функции для использования в качестве поиска вашей функции.

1 голос
/ 04 мая 2011

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

Если вы хотите вызвать функцию, основанную на содержимом данной строки, вы можете использовать вышеприведенное, или вы можете заключить постоянную строку с указателем на функцию внутри структуры и вызвать каждую из них.

0 голосов
/ 04 мая 2011

Сравните входную строку с известными именами функций.

Если строка X ... вызвать функцию X

0 голосов
/ 04 мая 2011

, поскольку в вашем массиве только 2 элемента ... мой путь noob =)

if ( strcmp(event, "function1") == 0 ) {
  function1();
} else if { strcmp(event, "function2") == 0 ) {
  function2();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...