Функции с переменными аргументами.Как работает open ()? - PullRequest
0 голосов
/ 28 июня 2011

Мне нужно написать функцию, которая принимает переменное число аргументов, аналогично функции open ()

int open (const char *filename, int flags[, mode_t mode])
  1. Я посмотрел на функциональность va_list, но как я могу узнать, сколько аргументов предоставил пользователь? Я не хочу иметь параметр в функции, который указывает на это.

  2. Будучи своего рода новичком, где я могу посмотреть, как реализована функция open ()? Как open () узнает, предоставил ли пользователь аргумент mode или нет?

Заранее спасибо.

Ответы [ 4 ]

5 голосов
/ 28 июня 2011
  1. Вы не можете.Вызывающая сторона должна либо предоставить конечный аргумент дозорного (например, 0), либо явно указать функции, сколько аргументов ожидать (например, поля формата в printf).

  2. open знает, что ожидать третьего аргумента, потому что вы установили флаг O_CREAT в аргументе flags.

2 голосов
/ 28 июня 2011

Скопировано прямо со страницы GCC .

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

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

 int
 add_em_up (int count,...)
 {
   va_list ap;
   int i, sum;

   va_start (ap, count);         /* Initialize the argument list. */

   sum = 0;
   for (i = 0; i < count; i++)
     sum += va_arg (ap, int);    /* Get the next argument value. */

   va_end (ap);                  /* Clean up. */
   return sum;
 }

 int
 main (void)
 {
   /* This call prints 16. */
   printf ("%d\n", add_em_up (3, 5, 5, 6));

   /* This call prints 55. */
   printf ("%d\n", add_em_up (10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10));

   return 0;
 }
0 голосов
/ 28 июня 2011

Короткий ответ на вопрос: "Как open узнает, было ли передано два или три аргумента?"это: это магия .Длинный ответ заключается в том, что реализация может делать определенные вещи, которые вы не делаете (в рамках стандартного C, то есть).

Другой пример - main.У него есть два действительных прототипа:

int main(void);

и

int main(int argc, char *argv[]); /* or equivalent */

Реализация должна позволять вам использовать любой из двух, и "выводить", который вы использовали.

Ответ на вопрос «Как я могу сделать что-то похожее в моем коде?»: вы не можете , по крайней мере, не в рамках ограничений, наложенных стандартом C.

0 голосов
/ 28 июня 2011

Что вам нужно, так это реализации функций с переменным числом аргументов. Вот документ , который проведет вас по всей цепочке.

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