#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, когда строки совпадают, а не наоборот.