2012-03-20 17 views
6

używam ROOT bibliotek C++ (root.cern.ch) dzienne i został przeglądając źródła kiedy natknąłem tej deklaracji funkcji:Proszę mi pomóc zrozumieć tę deklarację parametru C++ z argumentem

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

Może znaleźć here. Nie mam pojęcia, w jaki sposób const char * może mieć w nazwie argument lub nawias. Wyrażenie va_(fmt) jest później używane jako proste const char *, mimo że wygląda jak wywołanie funkcji lub konstruktora. Początkowo myślałem, że ma to coś wspólnego ze zmienną listą argumentów, co również było dla mnie nowością, ale czytanie dokumentacji na stdarg.h nie pomagało w ogóle na to pytanie.

Jest bardzo trudno google o pomoc, ponieważ nie jestem naprawdę pewien, jak to nazwać. Deklaracja z argumentem? To nie daje żadnych dobrych wyników.

Kiedyś myślałem, że znam C++, ale co tu się dzieje? Cała pomoc zostanie doceniona.

+1

Domyślam się, że jest po prostu 'va_' makro. Prawdopodobnie taki, który nie robi niczego poza rozwinięciem do swojego parametru. –

Odpowiedz

11

To makro - w Varargs.h:

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

Mówimy programistom C, że '# define' po prostu zaciemnia, ale czy oni nam wierzą? * Nie ... *^_- –

+0

Dzięki. Nawet czytałem ten plik. Musiałam przegapić. – Simon

+0

Kolejny przykład, dlaczego makra są złe. Jeśli 'fmt' byłby typem, składnia byłaby prawidłową deklaracją funkcji przyjmującej jako argument o nazwie' va_', wskaźnik do funkcji zwracającej 'char const *'. – bames53

Powiązane problemy