2012-03-26 6 views
2

Относительно [вопроса]: How do you pass a function as a parameter in C?Можете ли вы передать функцию с переменным количеством аргументов в качестве аргумента другой функции в C?

Возможно ли в C передать функцию, которая имеет переменное количество аргументов для другой функции? Если да, может кто-нибудь указать мне на какую-то документацию или наполнить меня? Благодарю.

ответ

3

Вы не можете передать функцию (любого вида) в качестве параметра, но вы можете передать указатель функции (опять же, почти любого рода). Это, как правило, проще всего использовать ЬурейеЕ:

typedef int (*fptr)(char const *, ...); // e.g., match with `printf` 

int apply(fptr f, char const *a, int b) { 
    return f(a, b); 
} 
0

Вы можете передать переменные аргументы работают точно так же, как вы бы другой функции.

Вот короткая тестовая программа, которая демонстрирует прохождение функции с переменным числом аргументов в качестве параметра:

int bar(int x, ...) { 
    /* In a real program, you would actually use the arguments beyond x */ 
    return x; 
} 

int foo(int (*baz)(int, ...)) { 
    return bar(10, "ABC"); 
} 

int main(void) { 
    printf("%d\n", foo(bar)); 
    return 0; 
} 

Он печатает 10, как можно было бы ожидать.

N.B. Вы фактически не можете передать функцию в качестве аргумента другой функции в C - вместо этого вы можете передать указатель функции , который указывает на фактическую функцию, загруженную из исполняемого файла. Это слабее, чем первоклассный статус функций в языках функционального программирования или даже статус делегата на некоторых объектно-ориентированных языках, таких как C#. Например, вы не можете создать функцию «на лету» в C.

0

Конечно. Их называют «вариационными функциями».

1) Просто используйте «многоточие» («...») в качестве последнего аргумента в функции прототипа

2) Для того, чтобы вызываемая функция „знать“, сколько аргументов были переданы ему , используйте макросы «va_start» и друзей в «stdargs»:

3) 1) и 2) выше - это просто функция, которая имеет переменную #/arguments. У вас также может быть указатель функции с переменной #/arguments. Сделайте то же самое - просто включите эллипсы («...») в свой прототип функции и используйте «stdargs» в реализации вашей функции.

+1

Макросы stdargs не сообщают вам, сколько аргументов есть. Никто не может вам этого рассказать. –

3

Вы можете сделать указатель на функцию, например:

typedef int (*vafunc)(const char *, ...); // like printf 

Однако, вы не можете действительно вперед аргументы, т.е. следующий не существует в стандартном C:

void call_other(vafunc f, const char * fmt, ...) 
{ 
    // want to say: 
    // f(fmt, ...); // How to write this??? 
} 

НКУ предлагает такой анонимный аргумент, отправляющий как расширение, но это невозможно в стандартном C. Обычно вы ожидаете, что каждая переменная функция будет соответствовать каждой переменной с помощью v..., которая принимает аргумент va_list, p для этой цели. (Вызов f с фиксированным числом аргументов возможен, конечно: f("abc", 1, 2, 3);)

+1

+1 для объяснения анонимного перенаправления аргументов (что прекрасно описывает существование 'vprintf'). –

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