Использует ли vsnprintf() все аргументы va_list, даже если выходные данные усекаются?C++

Программы на C++. Форум разработчиков
Ответить
Гость
 Использует ли vsnprintf() все аргументы va_list, даже если выходные данные усекаются?

Сообщение Гость »


Я создаю функцию журнала, имеющую функцию, подобную printf: log(LOG_LEVEL lvl, const char* fmt, ...).

LOG_LEVEL — это просто перечисление (0 имеет решающее значение, более высокое значение менее важно).

Если lvl выше, чем другая переменная (скажем, current_log_level), я хочу сделать как можно меньше и вернуться быстро. Однако я боюсь нарушить стек, не используя параметры после fmt, и мне хотелось бы, если возможно, не писать свой собственный «проверить fmt и вызвать va_arg() по мере необходимости», чтобы избежать возможных несоответствия с форматом printf, поэтому я подумал об использовании vsnprintf и просто о том, чтобы длина выходной строки была как можно меньшей.

Согласно документации, для vsnprintf, если длина равна 0, выходная строка может быть нулевой, но я не уверен, будут ли при этом использоваться все оставшиеся аргументы или она просто остановится обработка там и возврат.

Представьте себе следующее (я использую C++17, но думаю, это применимо и к старому доброму C):

перечисление класса LOG_LEVEL: unsigned int { ОШИБКА, ПРЕДУПРЕЖДЕНИЕ }; LOG_LEVEL current_log_level = LOG_LEVEL::WARNING; void log(LOG_LEVEL lvl, const char* fmt, ...) { va_list аргументы; va_start (аргументы, fmt); if (static_cast(lvl)
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»