У меня есть приблизительно 30 вариационных функций. Каждый принимает путь в качестве последнего аргумента, например:
bool do_foo(struct *f, int q, const char *fmt, ...)
В каждой функции я должен проверить, что расширенный формат меньше или равен определенному размеру. Итак, я обнаружил, что копирую/вставляя один и тот же фрагмент кода, чтобы проверить, сколько символов vsnprintf()
не печаталось, установите errno
соответственно и выйдите из записи.
Что бы я хотел сделать, это написать функцию для этого, которая вернет статически выделенную (расширенную) строку, которая, как известно, является безопасным размером, или новая инициализированная строка при сбое, которую можно проверить с помощью NULL. Проверки также должны определять, является ли строка абсолютным или относительным путем, что влияет на безопасный размер строки. Это много дублирующего кода, и он начинает пахнуть.
Есть ли способ передать содержимое elipsis из моей функции в другую функцию? Или мне нужно сначала вызвать va_start()
, а затем передать va_list
вспомогательной функции?
Edit:
Я вовсе не против передачи va_list
помощнику, я просто хотел убедиться, что ничего больше не существует. Мне кажется, что компилятор понимает, где начинаются переменные аргументы, поэтому мне было просто любопытно, могу ли я сказать, чтобы передать их.