Вопрос об определении функции (три точки в параметрах ..)

Я наткнулся на определение функции:

char* abc(char *f, ...)
{
}

Что означают три точки?

Ответов (4)

Решение

Такие функции называются вариативными функциями ( ссылка на Википедию ). Они используют многоточие (т. Е. Три точки), чтобы указать, что существует переменное количество аргументов, которые функция может обрабатывать. Одно место, где вы, вероятно, использовали такие функции (возможно, не осознавая), - это различные printf функции, например (из стандарта ISO):

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

Эллипсы позволяют создавать функции, в которых количество параметров заранее неизвестно, и вы можете использовать stdargs.h функции ( va_start, va_arg и va_end ) для получения конкретных аргументов.

Вы должны знать типы извлекаемых аргументов и иметь какой-то способ решить, когда вы закончите. Эти printf функции делают это с помощью строки формата (для обоих типов и количество), в то время как мой пример ниже код всегда предполагает const char * как тип со значением дозорного , NULL чтобы решить завершение.

Эта связь здесь имеет хороший трактат об использовании переменных списков аргументов в printf .


В качестве примера следующая программа содержит функцию outStrings(), которая позволяет печатать произвольное количество строк:

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

void outStrings(const char *strFirst, ...) {
    // First argument handled specially.

    printf("%s", strFirst);
    va_list pArg;
    va_start(pArg, strFirst);

    // Just get and process each string until NULL given.

    const char *strNext = va_arg(pArg, const char *);
    while (strNext != NULL) {
        printf("%s", strNext);
        strNext = va_arg(pArg, const char *);
    }

    // Finalise processing.

    va_end(pArg);
}

int main(void) {
    char *name = "paxdiablo";
    outStrings("Hello, ", name, ", I hope you're feeling well today.\n", NULL);
}

Их называют эллипсисом, и они означают, что функция может принимать неопределенное количество параметров. Вероятно, вашу функцию можно вызвать так:

abc( "foo", 0 );
abc( "foo", "bar", 0 );

Должен быть способ обозначить конец списка. Это можно сделать, используя первый параметр, например, ion a printf (строка формата 0) или специальный терминатор, ноль в приведенном выше примере.

Функции с переменным числом параметров считаются плохим тоном в C++, поскольку для параметров нельзя выполнять проверку типов или определенные пользователем преобразования.

Это то, что называется функцией varargs или функцией переменного аргумента в C.

Вы, вероятно, узнаете, что это printf.

Википедия о функциях vararg в C++ .