2012-03-20 16 views
6

Io uso le librerie C++ ROOT (root.cern.ch) tutti i giorni ed è stato dando un'occhiata al sorgente quando mi sono imbattuto in questa dichiarazione di funzione:Ti prego, aiutami a capire questa dichiarazione parametro C++ con un argomento

TString TString::Format(const char *va_(fmt), ...) 
{ 
    //etc. 

Si può essere trovato here.

Non capisco come un const char * possa avere un argomento o una parentesi nel suo nome. L'espressione va_(fmt) viene successivamente utilizzata come semplice const char * anche se sembra una chiamata di funzione o un costruttore. All'inizio pensavo che avesse qualcosa a che fare con la lista degli argomenti variabili, che era anche una novità per me, ma leggere la documentazione su stdarg.h non aiutava affatto questa domanda.

È molto difficile chiedere aiuto a Google perché non sono proprio sicuro di come chiamarlo. Una dichiarazione con una discussione? Questo non dà buoni risultati.

Pensavo di conoscere il C++, ma cosa sta succedendo qui? Tutto l'aiuto sarà apprezzato.

+1

La mia ipotesi è che 'va_' è semplicemente una macro. Probabilmente uno che non fa altro che espandere al suo parametro. –

risposta

11

E 'una macro - in Varargs.h:

#if ... 
# define va_(arg) __builtin_va_alist 
#else 
# define va_(arg) arg 
#endif 
+7

Diciamo ai programmatori di C che '# define' si offusca, ma ci credono? * No ... *^_- –

+0

Grazie. Ho persino letto quel file. Devo averlo perso. – Simon

+0

Un altro esempio del perché le macro sono cattive. Se 'fmt' fosse un tipo allora la sintassi sarebbe una dichiarazione valida di una funzione che assume, come argomento chiamato' va_', un puntatore a una funzione che restituisce 'char const *'. – bames53