va_end
viene utilizzato per eseguire la pulizia. Non vuoi distruggere lo stack, vero?
Da man va_start
:
va_end()
ogni chiamata va_start() deve essere accompagnata da una corrispondente invocazione di va_end() nella stessa funzione. Dopo la chiamata va_end (ap) la variabile ap non è definita. Sono possibili più attraversamenti dell'elenco, ciascuno tra parentesi con va_start() e va_end(). va_end() può essere una macro o una funzione.
Nota la presenza della parola deve.
Lo stack potrebbe essere danneggiato perché non si sa cosa sta facendo va_start()
. I macro va_*
sono pensati per essere trattati come scatole nere. Ogni compilatore su ogni piattaforma può fare tutto ciò che vuole lì. Potrebbe non fare nulla, o potrebbe fare molto.
Alcune ABI passano i primi pochi arg in registri e il resto in pila. A va_arg()
ci potrebbe essere più complicato. Puoi cercare in che modo una determinata implementazione fa vararg, che può essere interessante, ma scrivendo codice portatile dovresti trattarli come operazioni opache.
È davvero una buona domanda. Vorrei che qualcuno rispondesse descrivendo un'architettura in cui va_end non è un no-op. – erikkallen
FYI: MSVS2008 - #define _crt_va_end (ap) (ap = (va_list) 0) – Yarik
@erikkallen: fai una ricerca su google per "define va_end" e troverai alcune definizioni insolite che potrebbero o meno essere essenzialmente no- operazione. – PlasmaHH