В чистом C, как я могу передать переменное количество параметров в функцию? - PullRequest
1 голос
/ 12 июня 2010

Как я могу передать (и получить доступ), используя C, а не c ++, переменные параметры в функцию?

void foo(char* mandatory_param, char* optional_param, char* optional_param2...)

спасибо

/ fmsf

Ответы [ 5 ]

12 голосов
/ 12 июня 2010

Использование stdarg.h

Вам необходимо использовать va_list, а затем использовать макросы va_start, va_arg и va_end.

Для получения дополнительной информации см. http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.10.html

9 голосов
/ 12 июня 2010

Звучит так, будто вы ищете varargs.

#include <stdarg.h>
void foo(const char *fmt, ...)
{
  va_list argp;
  va_start(argp, fmt);
  int i = va_arg(argp, int);
  // Do stuff...
  va_end(argp);
}
7 голосов
/ 12 июня 2010
1 голос
/ 12 июня 2010
#include <stdarg.h>

void do_sth (int foo, ...)
{
    int baz = 7;             /* "baz" argument */
    const char *xyz = "xyz"; /* "xyz" argument */

    /* Parse named parameters */
    va_list ap;
    va_start (ap, foo);
    for (;;) {
        const char *key = va_arg (ap, char *);
        if (key == NULL) {
            /* Terminator */
            break;
        } else if (strcmp (key, "baz") == 0) {
            baz = va_arg (ap, int);
        } else if (strcmp (key, "xyz") == 0) {
            xyz = va_arg (ap, char *);
        } else {
            /* Handle error */
        }
    }
    va_end (ap);

    /* do something useful */
}

do_sth (1, NULL);                             // no named parameters
do_sth (2, "baz", 12, NULL);                  // baz = 12
do_sth (3, "xyz", "foobaz", NULL);            // xyz = "foobaz"
do_sth (4, "baz", 12, "xyz", "foobaz", NULL); // baz = 12, xyz = "foobaz"

Назначение различных функций и аргументов в C / C ++

1 голос
/ 12 июня 2010

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

  1. Создание нескольких перегрузок одной и той же функции. Насколько я помню, вы не можете сделать это в C.

  2. Используйте функции с переменным числом. Просто Google это: http://www.google.com/search?q=variadic+function+c

  3. Я рекомендую это: создать класс «params» или «args» (или структуру в C), например:

)

// untested C code
struct FooArgs {
    char * mandatory_param;
    char * optional_param;
    char * optional_param2;
    // add other params here;
};

и затем вызовите ваш метод в одном аргументе:

// untested
void foo(struct fooArgs * args)

Таким образом, при необходимости вы можете добавить параметров в fooArgs, не нарушая ничего.

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