Использует ли vsnprintf() все аргументы va_list, даже если выходные данные усекаются? ⇐ 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)
Я создаю функцию журнала, имеющую функцию, подобную 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)
Мобильная версия