Variadic macros
• tech • 197 słów • 1 minuta czytania
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.
Komentarze (0)