Каков правильный способ передачи переменного количества аргументов непосредственно в функцию, которая принимает переменные аргументы?
Как вы узнаете, что буфер достаточно велик? И вы действительно должны вернуть количество преобразований, выполненных sprintf(), иначе пользователи не смогут узнать, что функция сработала. 11.03.2010
Я вырезал все, что не было необходимо для иллюстрации моей точки зрения. Очевидно, в моем коде релиза я гораздо тщательнее :) Mike 11.03.2010
Я не уверен, насколько полезным будет этот код, поскольку он написан на C++, но он показывает, как с помощью специальной функции Win32 vsnprintf() проверить, что выделенный буфер достаточно велик, а если нет, то выделяет еще больший. И он возвращает std::string, поэтому вам придется использовать malloc/realloc для обработки этого. Но какого черта:
string Format( const char * fmt, ... ) {
const int BUFSIZE = 1024;
int size = BUFSIZE, rv = -1;
vector <char> buf( size );
do {
va_list valist;
va_start(valist, fmt );
// if vsnprintf() returns < 0, the buffer wasn't big enough
// so increase buffer size and try again
rv = _vsnprintf( &buf[0], size, fmt, valist );
va_end( valist );
size *= 2;
buf.resize( size );
}
while( rv < 0 );
return string( &buf[0] );
}
Ответ 3 · рейтинг -1 · Medran
Вы можете использовать функции стиля vsprintf, чтобы получить печать в стиле printf для вашего параметра переменной длины. Однако нет необходимости делать это. Вы можете, если решите написать свою функцию, чтобы она продолжала принимать параметры, пока не встретит нулевой указатель.
Это действительно зависит от вас, возможности безграничны. Я думаю, что единственным реальным требованием к эллипсам является наличие хотя бы одного параметра перед эллипсами.