Передайте строку, содержащую имя функции и ее аргументы, другой функции. - PullRequest
0 голосов
/ 31 января 2012

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

Ответы [ 4 ]

2 голосов
/ 31 января 2012

Если вы хотите написать функцию со строкой формата и переменными аргументами, такими как:

int function(const char* strFormat, ... )
{
  //parse out the format using regex or something
  //then store the data into the variable aruments
  //or create a string concatenating everything
}

как, скажем, printf, sprintf или scanf,

тогда лучшее, что вам нужно сделать, - это посмотреть несколько хороших уроков.

http://msdn.microsoft.com/en-us/library/fxhdxye9(v=vs.80).aspx

http://www.cprogramming.com/tutorial/c/lesson17.html

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

объект glib - отличный пример самоанализа в c. http://developer.gnome.org/gobject/stable/

что-то простое без самоанализа может быть:

void* function (const char* strFunctionName, ... )
{
  if(!strcmp(strFunctionName, "functionA"))
  {
    //use va_list to parse out the arguments for the function.
    functionA(//each of the arguments from va_list);
  }
  else if(!strcmp(strFunctionName, "functionB"))
  {
    //use va_list to parse out the arguments for the function.
    functionB(//args from va_list);
  }
  ...
}

Если у вас есть что-то более конкретное, укажите в своем вопросе.

1 голос
/ 31 января 2012

Я не уверен, что это стандарт, но вы можете использовать __PRETTY_FUNCTION__ в C ++.

например:

void foo(int a, int b)
{
    cout << __PRETTY_FUNCTION__ << endl;
}

выходы:

void foo(int, int)
0 голосов
/ 06 февраля 2012

Если вы хотите выполнить код из строки (я просто догадываюсь, ваш вопрос трудно понять), тогда есть много доступных вариантов: от встраивания всего Clang и LLVM в ваш код (и проверки егоJIT знает обо всех ваших декларациях, которые вы собираетесь экспортировать) для встраивания простого языка сценариев (например, Lua или Guile) и предоставления оболочек для всех функций, которые вы хотите вызывать таким образом.

0 голосов
/ 31 января 2012

Если вы хотите сделать:

char *funct = "foo(bar)";

на самом деле вызвать функцию foo(), тогда это невозможно, C просто так не работает. Я бы порекомендовал:

а) вы садитесь и переосмысливаете свое приложение, потому что такое поведение ни к чему не нужно.

б) попробуйте язык с такими возможностями, как target-c

в) если вы действительно, действительно, действительно хотите это сделать ... тогда создайте синтаксический анализатор строк и множество указателей if или function. Что-то в строках:

  1. Получить строку в виде "function (var1, var2, ..., varN)"
  2. Получить имя функции (т. Е. Все до '(')
  3. Получить все параметры (например, strtok())
  4. Определите функцию, сравнивающую имена констант с вашей строкой (strcmp())
  5. Если параметры числовые (isdigit() или sscanf( string, "%d", &parameter ) > 0), преобразуйте их в пригодный для использования примитив (atoi(), atof() и т. Д. Или sscanf())
  6. Передать параметры вашей функции.
...