Вызов функции из строки в C

#c

#c

Вопрос:

Как в 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;
}
  

Ответ №1:

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

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

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

Комментарии:

1. Не могли бы вы рассказать немного подробнее, я не совсем уверен, как это будет сделано.

Ответ №2:

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

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

Ответ №3:

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

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

Комментарии:

1. Мне было скучно, и я написал это: codepad.org/3BRapq7T (к сожалению, codepad, похоже, не предлагает необходимую библиотеку)

2. @Martin: dlopen() и family существовали и раньше: Unix принял их, а POSIX стандартизировал. Аналогичная возможность существует в паре систем, отличных от POSIX, таких как Win32, с использованием LoadLibrary и GetProcAddress .

Ответ №4:

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

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

Ответ №5:

поскольку в вашем массиве всего 2 элемента … мой способ новичка =)

 if ( strcmp(event, "function1") == 0 ) {
  function1();
} else if { strcmp(event, "function2") == 0 ) {
  function2();
}
  

Комментарии:

1. Строки в C подобным образом не сравниваются.

2. Самый простой способ сравнить строки в C — с strcmp() : if (strcmp(event, "function1") == 0) { function1(); }

3. Просто, кстати, strcmp возвращайте 0, когда строки совпадают, а не наоборот.