Поддерживают ли функции C произвольное количество аргументов? - PullRequest
3 голосов
/ 09 сентября 2010

PHP имеет func_get_args() для получения всех аргументов функции, а JavaScript имеет объект functions.

Я написал очень простой max() на C

int max(int a, int b) {

    if (a > b) {
        return a;   
    } else {
        return b;
    }
}

Я почти уверен, что в большинстве языков вы можете указать любое количество аргументов для их встроенных max() (или эквивалентных).

Я думал, что этот вопрос мог быть тем, что я хотел, но я не думаю, что это так.

Пожалуйста, имейте в виду, я тоже все еще учусь. :)

Большое спасибо.

Ответы [ 7 ]

10 голосов
/ 09 сентября 2010

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

#include <stdio.h>
#include <stdarg.h>

int sum(int numArgs, ...)
{
    va_list args;
    va_start(args, numArgs);

    int ret = 0;

    for(unsigned int i = 0; i < numArgs; ++i)
    {
        ret += va_arg(args, int);
    }    

    va_end(args);

    return ret;
}    

int main()
{
    printf("%d\n", sum(4,  1,3,3,7)); /* prints 14 */
}

Функция предполагает, что каждый аргумент переменной является целым числом (см. va_arg вызов).

5 голосов
/ 09 сентября 2010

Да, в C есть понятие функций с переменными числами, которое аналогично тому, как printf() допускает переменное число аргументов.

Максимальная функция будет выглядеть примерно так:

#include <stdio.h>
#include <stdarg.h>
#include <limits.h>

static int myMax (int quant, ...) {
    va_list vlst;
    int i;
    int num;
    int max = INT_MIN;

    va_start (vlst, quant);

    for (i = 0; i < quant; i++) {
        if (i == 0) {
            max = va_arg (vlst, int);
        } else {
            num = va_arg (vlst, int);
            if (num > max) {
                max = num;
            }
        }
    }
    va_end (vlst);
    return max;
}

int main (void) {
    printf ("Maximum is %d\n", myMax (5, 97, 5, 22, 5, 6));
    printf ("Maximum is %d\n", myMax (0));
    return 0;
}

Это выводит:

Maximum is 97
Maximum is -2147483648

Обратите внимание на использование переменной quant.Как правило, есть два способа указать конец ваших аргументов: либо счет спереди (5), либо значение часового в конце.

Примером последнего будет список указателей,передавая NULL как последний.Поскольку эта функция max должна иметь возможность обрабатывать весь диапазон целых чисел, дозорное решение нежизнеспособно.

Функция printf использует первый подход, но немного по-другому.У него нет определенного count , скорее он использует поля % в строке формата для определения других аргументов.

3 голосов
/ 09 сентября 2010

На самом деле это два вопроса.Прежде всего, C99 требует, чтобы реализация C могла обрабатывать как минимум:

  • 127 параметров в одном определении функции
  • 127 аргументов в одном вызове функции

Теперь, на ваш реальный вопрос, да, в C99 есть так называемые функции и макросы.Синтаксис для объявления с ... в списке аргументов.Реализация функций variadic идет с макросами из заголовочного файла stdarg.h.

2 голосов
/ 09 сентября 2010

вот ссылка на сайт, который показывает пример использования varargs в c Написание функции `` varargs ''

Вы можете использовать функцию va_args, чтобы получить дополнительные аргументыперейти к функции.И используя это вы можете передать 0-н необязательные параметры.Таким образом, вы можете поддержать более 2 аргументов, если выберете

1 голос
/ 09 сентября 2010

Другая альтернатива - передать массив, например, main(). например:

int myfunc(type* argarray, int argcount);

1 голос
/ 09 сентября 2010

Да, вы можете объявить функцию variadic в C. Наиболее часто используемой является, вероятно, printf, которая имеет объявление, которое выглядит следующим образом

int printf(const char *format, ...);

... - это то, как он объявляет, что принимает переменное число аргументов.

Для доступа к этому аргументу он может использовать va_start, va_arg и т.п., которые обычно являются макросами, определенными в stdarg.h. Смотри здесь

Вероятно, также стоит отметить, что вы часто можете "запутать" такую ​​функцию. Например, следующий вызов printf напечатает все, что происходит на вершине стека при его вызове. На самом деле это, вероятно, сохраненный базовый указатель стека.

printf("%d");
0 голосов
/ 09 сентября 2010

C может иметь функции, получающие произвольное количество параметров.

Вы уже знаете один из них: printf()

printf("Hello World\n");
printf("%s\n", "Hello World");
printf("%d + %d is %d\n", 2, 2, 2+2);

Не существует функции max, которая принимает произвольное числочисло параметров, но это хорошее упражнение для вас, чтобы написать свой собственный.

Используйте <stdarg.h> и идентификаторы va_list, va_start, va_arg и va_end, определенные в этом заголовке.

http://www.kernel.org/doc/man-pages/online/pages/man3/stdarg.3.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...