Что означает "..." в объявлении функции c? - PullRequest
2 голосов
/ 14 ноября 2011

Я просматривал заголовочный файл stdio.h, который поставляется с MinGW, и заметил, что функция printf объявлена ​​так:

int printf (const char *__format, ...)
{
    //body omitted
}

Я никогда раньше не видел многоточия в списке параметров функции, поэтому я попробовал его. Он компилируется и запускается без ошибок. Какова же тогда цель "..."?

Ответы [ 3 ]

5 голосов
/ 14 ноября 2011

Это означает, что функция является переменной функцией, которая принимает переменное число параметров:

http://en.wikipedia.org/wiki/Variadic_function

printf() сам по себе является, вероятно, лучшим примером функции с переменным числом.

2 голосов
/ 14 ноября 2011

Сообщает компилятору, что функция имеет список переменных параметров. Эта функция работает только с соглашением о вызовах __cdecl. Это позволяет вызывающей стороне указывать любые значения параметров, которые она хочет после последнего фиксированного параметра, так как вызывающая сторона будет очищать параметры при выходе из функции. Параметры Variadic обычно используются для функций в стиле printf, где интерпретация значений параметров Variadic зависит от значения фиксированных значений параметров (например, сопоставление отдельных параметров Variadic с каждым спецификатором формата в параметре __format). *

1 голос
/ 14 ноября 2011

используется, чтобы разрешить переменное число аргументов или параметров неопределенного типа, как printf() делает.функция, которая допускает переменное число аргументов, называется Variadic Function

Variadic Переменные доступны с помощью va_start, va_list, va_end и va_arg

Переменное число аргументов (...)

Пример реализации:

#include <stdarg.h>

double average(int count, ...)
{
    va_list ap;
    int j;
    double tot = 0;
    va_start(ap, count); //Requires the last fixed parameter (to get the address)
    for(j=0; j<count; j++)
        tot+=va_arg(ap, double); //Requires the type to cast to. Increments ap to the next argument.
    va_end(ap);
    return tot/count;
}

Надеюсь, это поможет.

...