Есть ли способ "дестринифицировать" входные данные, чтобы их можно было использовать в качестве идентификатора?


Задача

Можно ли "дестрировать" строку ввода из файла,чтобы сделать ее похожей на переменную или идентификатор? Пример может помочь проиллюстрировать, что я имею в виду:

// A few functions, definitions of these don't matter in this example.
void func1();
void func2();
void func3();

// Main function reading a line in from the user
int main() {
  char input[8];
  fgets( input, 8, stdin );
  /* Pretend the newline has been stripped already */
  void(*fn_ptr)();
  fn_ptr = destringify( input );
  fn_ptr();
  return;
}

В основном, используя приведенный выше пример, я спрашиваю, как бы я "destringify" вход так, чтобы fn_ptr указывал на соответствующую функцию (func1, func2 или func3)? Такая функция была бы полезна, поскольку она позволяет мне позволить пользователю выбрать, какую функцию Использовать, будучи в состоянии использовать указатель на одну функцию.

Ограничения

  1. таблицу подстановки было бы трудно реализовать, поскольку я планирую позволить пользователям создавать свои собственные функции, но если это единственное решение, то все в порядке.
  2. По той же причине я предпочел бы избегать switch...case и if...else.
1 2

1 ответ:

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

  1. Многие операционные системы поддерживают определенную функциональность для поиска адреса функции, заданной ее именем. Например, в Windows для этого можно использовать LoadLibrary и GetProcAddress. Это делает ваш код менее переносимым, но может быть тем, что вы ищете. (Это также серьезная проблема безопасности, но это совсем другая история.)

  2. Еще один вариант можно было бы создать своего рода хэш-таблицу или BST, связывающую коллекцию строк с указателями функций. Затем пользователь может указать, какую функцию вызывать, читая входные данные пользователя, просматривая эту строку в хэш-таблице/BST, а затем вызывая указатель вызываемой функции. Вы должны убедиться, что вручную заполняете хэш-таблицу или BST, что является дополнительной работой, но также дает вам контроль над тем, какие функции могут быть вызваны.

Надеюсь, это поможет!