Mam około 30 funkcji variadycznych. Każdy przyjmuje ścieżki jako argumentu końcowego, np .:Przekazywanie elipsy do innej funkcji variadycznej
bool do_foo(struct *f, int q, const char *fmt, ...)
W każdej funkcji, trzeba sprawdzić, czy rozszerzonego formatu jest mniejsza niż lub równa pewnej wielkości. Tak więc, znajduję sobie kopię/wklejenie tego samego kawałka kodu, aby sprawdzić, ile znaków nie zostało wydrukowanych przez vsnprintf()
, odpowiednio ustaw errno
i wyskocz z zapisu.
Co chciałbym zrobić, to napisać funkcję, która to zrobi, która zwróci statycznie przydzielony (rozwinięty) ciąg, który jest znany jako bezpieczny rozmiar, lub nowo zainicjowany ciąg w przypadku niepowodzenia, który może być sprawdzony pod kątem NULL . Kontrole muszą również określić, czy łańcuch jest ścieżką bezwzględną lub względną, co wpływa na bezpieczny rozmiar ciągu znaków. To dużo duplikatu kodu i zaczyna pachnieć.
Czy istnieje sposób, że mogę przekazać zawartość elipsis z wejścia mojej funkcji do innej funkcji? Czy muszę najpierw zadzwonić pod numer va_start()
, a następnie przekazać va_list
do funkcji pomocnika?
Edit:
nie jestem w ogóle przeciwny minięciu va_list
do pomocnika, po prostu chciałem się upewnić, że nic innego nie istniało. Wydaje mi się, że kompilator rozumie, gdzie zaczynają się argumenty variadyczne, więc byłam ciekawa, czy mogę powiedzieć, żeby przekazać je dalej.
Czy jest jakiś powód, dla którego są niekorzystne dla minięciu va_list do pomocnika? – ojblass
Musiałem robić podobne rzeczy, ale musiałem pozbyć się kilku argumentów ... nie był przyjemny kod do utrzymania. – ojblass