Variadic macros

28 października 2008

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.

Podobne notatki:

Może zainteresują Cię również następujące, pododbne notatki:

Komentarze i nawiązania (1)

Kanał RSS komentarzy

  1. [...] marudziłem o makrach i funkcjach ze zmienną liczbą argumentów, wiec dziś do uzupełnienia tego tematu kilka słów o [...]

Dodaj swój komentarz

Możesz użyć tych tagów XHTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Jeśli chcesz wstawić kilku linijkowy fragment kodu, użyj tagów <pre lang="x"></pre> (gdzie x język kodu np. cpp, perl, html). W ten sposób kod zostanie odpowiednio sformatowany i pokolorowany przez system.

Uwaga!

Na tym blogu działa system cache oraz filtr antyspamowy. Twój komentarz może być widoczny na stronie z pewnym opóźnieniem. Proszę o cierpliwość. Jeśli utraciłeś już wszystkie jej zasoby poinformuj mnie o tym, być może system uznał Cię za spamera ;)