Многоточие ...
в прототипе функции используется для обозначения функции как переменной.То есть он позволяет переменному количеству аргументов передаваться в функцию.В этой форме функция должна определить, каким образом пользователь может указать, сколько именно аргументов он представил, поскольку функции библиотеки переменных в 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;
}