Variadic macros

Można się zdziwić, ale makra również mogą posiadać zmienną liczbę argumentów, tak jak funkcje.

Najbardziej znaną funkcją o zmiennej licznie argumentów jest funkcja printf z standardowej biblioteki języka C:

int printf(const char* fmt, ...);

Makra również posiadają taką możliwość, zwie się to, jak nazwa notki, - Variadic Macros.

Proste makro TRACE opakowujące printfa:

#define TRACE(fmt, ...)	printf("%s:%d " fmt, __FILE__, __LINE__, __VA_ARGS__)

i proste użycie:

TRACE("x=%d, y=%d", 1, 2);

Kluczową role w tej konstrukcji pełni identyfikator __VA_ARGS__, który zostaje zamieniony na wszystkie ekstra argumenty, nie określone w definicji makra, a raczej określone przez ....

Variadic macros zostało wprowadzone w definicji standardu C99, więc nie powinno być z nim problemów w większości kompilatorów języka C++.

GCC posiada rozszerzenie, dzięki któremu możemy zastąpić __VA_ARGS__,  dowolną swoja nazwą:

#define err(args...)	fprintf(stderr, args)

Jedyny mały problem na jaki możemy natrafić korzystając z wielokropka w makrach związany jest z przecinkiem, kiedy __VA_ARGS__ jest pusty, nieużywany w wywołaniu, i pozostaje zbędny przecinek. W VC++ zostanie on  w takich sytuacjach usunięty automatycznie, w GCC musimy wstawić dodatkowe ## między , a __VA_ARGS__.

Na tą ciekawą, a czasem bardzo przydatną możliwość trafiłem całkiem przypadkiem jakiś czas temu na blogu Xiona w notce Makra z wielokropkiem.

Jedno przemyślenie nt. „Variadic macros”

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *