«...» в прототипе функции - PullRequest
       0

«...» в прототипе функции

3 голосов
/ 31 августа 2010

Я видел, что у чьего-то кода C ++ есть объявление функции, как показано ниже:

void information_log( const char* fmt , ...)

или блок перехвата, например

catch(...)
{
}

Что означает "..."?

Ответы [ 6 ]

8 голосов
/ 31 августа 2010

Многоточие ... в прототипе функции используется для обозначения функции как переменной.То есть он позволяет переменному количеству аргументов передаваться в функцию.В этой форме функция должна определить, каким образом пользователь может указать, сколько именно аргументов он представил, поскольку функции библиотеки переменных в C ++ не могут определить эту информацию динамически.

Например, функция stdio printf - одна из таких функций с прототипом:

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

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

Ниже приведен пример реализации функции с переменным числом аргументов:

// cstdarg provides access to the arguments passed to the ellipsis
#include <cstdarg> // or (#include <stdarg.h>)
#include <cstdio>
#include <cstring>

// Concatenates as many strings as are present
void concatenate(char ** out, int num_str, ...)
{
    // Store where the arguments are in memory
    va_list args;

    // Find the first variadic argument, relative to the last named argument
    va_start(args, num_str);

    int out_len = 0;
    int * lengths = new int[num_str];
    char ** strings = new char*[num_str];

    // Extract the strings from the variadic argument list
    for(int i = 0; i < num_str; i++)
    {
        // Specify the position in the argument list and the type
        // Note: You must know the type, stdarg can't detect it for you
        strings[i] = va_arg(args, char *);
        lengths[i] = strlen(strings[i]);
        out_len += lengths[i];
    }

    // Concatenate the strings
    int dest_cursor = 0;
    (*out) = new char[out_len + 1];
    for(int i = 0; i < num_str; i++)
    {
        strncpy( (*out) + dest_cursor, strings[i], lengths[i]);
        dest_cursor += lengths[i];
    }
    (*out)[dest_cursor] = '\0';

    // Clean up
    delete [] strings;
    delete [] lengths;
    va_end(args);
}

int main()
{
    char * output = NULL;

    // Call our function and print the result
    concatenate(&output, 5, "The ", "quick", " brown ", "fox ", "jumps!\n");
    printf("%s", output);

    delete [] output;
    return 0;
}
7 голосов
/ 31 августа 2010

Это на самом деле два отдельных вопроса, использующих один и тот же символ.: -)

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

Код catch (...) просто означает, что нужно перехватить любое исключение(Обычно вы ставите это после ряда определенных блоков catch, чтобы это работало как «catch-all».)

3 голосов
/ 31 августа 2010

$ 5.2.2 / 6 - «Можно объявить функцию, принимающую меньше аргументов (путем объявления аргументов по умолчанию (8.3.6)) или больше аргументов (с помощью многоточия, ... 8.3.5), чемколичество параметров в определении функции (8.4). [Примечание: это подразумевает, что, кроме случаев, когда используется многоточие (...), параметр доступен для каждого аргумента.] "

Это довольно хорошо подводит итог интерпретации объявления "information_log" в OP

$ 15.3 / 6 - "A ... в объявлении-исключении обработчика функционирует аналогично ... в параметре функцииобъявление; оно определяет совпадение для любого исключения. Если присутствует, обработчик ... должен быть последним обработчиком для его блока try. "

Хотя это и не стандартный термин, его часто называютпредложение catch all или catch all.

void f(){
    try{
        throw 2.2;       // throw double
    }
    catch(int){}              // standard conversion from double to int not permitted
    catch(...){
        cout << "catch it here";   // is caught here in catch all clause
    }
}

int main(){
    f();
}
3 голосов
/ 31 августа 2010

Для ловли это означает ловить что-нибудь.Таким образом, все сгенерированные исключения войдут в этот блок catch.

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

2 голосов
/ 31 августа 2010

Многоточие представляет список переменных параметров.

http://publications.gbdirect.co.uk/c_book/chapter9/stdarg.html

http://msdn.microsoft.com/en-us/library/fxhdxye9(VS.80).aspx

1 голос
/ 31 августа 2010

См. Функции с неопределенным количеством параметров

Использование многоточия, ..., с C ++ прототипы функций, означает, что Функция может быть указана с неизвестный номер и тип параметров . Эта функция может быть использована для подавления проверка типа параметра и разрешить гибкость интерфейса к функция. C ++ позволяет функциям быть объявлено с неопределенным количеством аргументы.

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