2012-01-31 8 views
-2

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

+0

Не имеет смысла «делать [a] строку как вызов функции». –

+2

Я бы с удовольствием помог, но я не могу сделать из вашего вопроса никакого смысла. Пожалуйста, пересмотреть и повторить попытку. –

+0

@CodyGray и Jonathan Henson Я работаю над переменным количеством параметров. Так что для каждого вызова функции я получаю другой список параметров, поэтому я формирую строку со всеми параметрами. – johnkrishna

ответ

2

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

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 или зсапЕ делает,

то лучше всего для вас сделать Посмотрите на некоторые хорошие уроки.

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

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

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

gobject 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); 
    } 
    ... 
} 

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

+0

спасибо за ваше время, но вы не получили мой вопрос. Я не пытаюсь использовать функцию с переменным числом аргументов. Я пытаюсь предположить, что у меня есть строка char * str = "variance (dArray, p1, p2) ". Как сделать эту строку как обычный вызов функции – johnkrishna

+0

@johnkrishna Использование переменных аргументов сделает анализ синтаксических данных и их значений намного проще, чем запись невероятно сложного регулярного выражения. –

+0

еще раз спасибо, но мы оба на разных дорожках. Кажется, что в моем сценарии каждый раз строка будет меняться, в зависимости от параметров, которые я получаю, поэтому мне просто нужно, чтобы мой компилятор C обрабатывал мою строку как вызов функции. – johnkrishna

0

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

char *funct = "foo(bar)"; 

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

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

б) попробовать язык с такими возможностями, такими как Objective-C

с), если вы действительно, действительно, действительно хотите сделать это ... затем сделать строку парсер и много если, либо указателей функций , Что-то в строках:.

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

спасибо. Я думаю, ваш вариант c будет полезен для меня.есть ли способ в C++? – johnkrishna

+0

@johnkrishna Невозможно сделать это на любом языке, который не поддерживает отражение. Ваши c-подобные параметры, если вы хотите сделать это, - Java, Objective-C или C#. Или вы можете реализовать отражение себя в c или на C++. –

+0

@whitlionV здесь параметры функции будут продолжать изменяться, в этом случае, как идентифицировать типы (потому что strtok() предоставит все из них в виде строк) – johnkrishna

1

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

например:

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

выходы:

void foo(int, int) 
+0

спасибо за редактирование :) – NullPointer

0

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

+0

ya Я хочу выполнить метод, который находится в строке. но это в C/C++. Чтобы правильно понять мой вопрос, см. этот http://stackoverflow.com/questions/9156389/how-to-parse-a-string-so-that-compiler-executes-the -statements-inside – johnkrishna

+0

Нет, ваш вопрос все еще очень далек от того, чтобы быть ясным. И, кстати, 'Clang' является компилятором C. Вы также можете попробовать встраивать 'tcc' (он специально создан для этой цели), он намного меньше и быстрее, чем clang. –

Смежные вопросы