Ho circa 30 funzioni variadiche. Ognuno accetta un percorso come argomento finale, es .:Passaggio di un'ellissi a un'altra funzione variadica
bool do_foo(struct *f, int q, const char *fmt, ...)
In ogni funzione, devo verificare che il formato espanso è inferiore o uguale ad una certa dimensione. Quindi, mi trovo a copiare/incollare lo stesso pezzo di codice per verificare quanti caratteri non sono stati stampati vsnprintf()
, impostare errno
di conseguenza e salvare la scrittura.
Quello che mi piacerebbe fare è scrivere una funzione per fare ciò, che restituirebbe una stringa allocata staticamente (espansa) che è nota per essere una dimensione sicura o una stringa appena inizializzata in caso di errore, che potrebbe essere verificata con NULL . I controlli devono anche determinare se la stringa è un percorso assoluto o relativo, che influenza la dimensione sicura della stringa. È un sacco di codice duplicato e sta iniziando a puzzare.
Esiste un modo per trasferire il contenuto degli elipsis dalla voce della mia funzione a un'altra funzione? O devo prima chiamare lo va_start()
e poi passare il va_list
alla funzione di supporto?
Edit:
Io non sono affatto contrario a passare il va_list
al aiutante, volevo solo fare in modo che nient'altro esisteva. Mi sembra che il compilatore capisca dove iniziano gli argomenti variadici, quindi ero solo curioso di sapere se li avrei passati.
C'è qualche ragione siete avversi a passare il va_list al aiutante? – ojblass
Ho dovuto fare cose simili, ma ho dovuto eliminare alcuni degli argomenti ... non era un codice piacevole da mantenere. – ojblass