Варіати́вний ма́крос — можливість препроцесором Сі за допомогою спеціального макроса оголошувати підтримку різного числа аргументів.
Макрос зі змінним числом аргументів представлено 1999 року в ревізії ISO/IEC 9899:1999 (C99) стандарту мови програмування C. Також такі макроси 2011 року введено в ревізію ISO/IEC 14882:2011 () стандарту .
Синтаксис оголошення
Синтаксис оголошення схожий зі синтаксисом варіативної функції: пропуск «...» використовується для позначення того, що можна передати нуль або більше аргументів. При розширенні макросом, кожен виклик спеціального ідентифікатора __VA_ARGS__ у списку заміщення макроса замінюється переданими аргументами.
Доступ до індивідуальних аргументів у списку формальних параметрів не здійснюється ні за значенням, ні за способом, яким їх передано.
У gcc у списку формальних параметрів макроса можуть бути як позначені аргументи (англ. specified arguments), так і передані варіативно (див. приклад).
Підтримка
GNU Compiler Collection, починаючи з версії 3.0, 2006 і Visual Studio 2005 [1] [ 8 квітня 2008 у Wayback Machine.] підтримують макроси зі змінним числом аргументів при компіляції коду як мовою C, так і мовою . Крім того, GCC підтримує варіативні макроси при компіляції коду мовою Objective-C.
Приклад
Якщо потрібно -подібній функції dprintf(), що приймає ім'я файлу і номер рядка, з якого викликається як аргумент, можна використати такий макрос:
void realdprintf (char const *file, int line, char const *fmt, ...); #define dprintf(...) realdprintf(__FILE__, __LINE__, __VA_ARGS__)
dprintf() можна викликати як:
dprintf("Hello, world");
який доповнюється до:
realdprintf(__FILE__, __LINE__, "Hello, world");
або:
dprintf("%d + %d =%d", 2, 2, 5);
який доповнюється до:
realdprintf(__FILE__, __LINE__, "%d + %d =%d", 2, 2, 5);
Альтернативи
У деяких випадках альтернативою варіативним макросам може стати звичайний макровиклик. Наприклад, такий код можна використати для налагодження:
#ifdef TRACING #define TRACE(_p)printf _p #else #define TRACE(_p) #endif
Якщо макрос TRACING визначено під час компіляції, виклик макроса TRACE буде еквівалентним виклику функції printf:
TRACE(("Виконується рядок %d\n", __LINE__));
Якщо макрос TRACING не визначено, під час роботи програми повідомлення не друкуватиметься. Зверніть увагу, що параметри виклику цього макроса слід укласти в подвійні дужки.
У деяких інших випадках замість варіативних макросів можна використати функціонал мов C/C++ і виклик функції .
Інший приклад:
#if defined ( DEBUG_MCU ) #define TRACE( args ... ) printf( args ) #else #define TRACE( args ... ) #endif
Див. також
Примітки
- Working draft changes for C99 preprocessor synchronization — http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm [ 31 липня 2020 у Wayback Machine.]
Джерела
- (рос.)
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Variati vnij ma kros mozhlivist preprocesorom Si za dopomogoyu specialnogo makrosa ogoloshuvati pidtrimku riznogo chisla argumentiv Makros zi zminnim chislom argumentiv predstavleno 1999 roku v reviziyi ISO IEC 9899 1999 C99 standartu movi programuvannya C Takozh taki makrosi 2011 roku vvedeno v reviziyu ISO IEC 14882 2011 C 11 standartu movi programuvannya C Sintaksis ogoloshennyaSintaksis ogoloshennya shozhij zi sintaksisom variativnoyi funkciyi propusk vikoristovuyetsya dlya poznachennya togo sho mozhna peredati nul abo bilshe argumentiv Pri rozshirenni makrosom kozhen viklik specialnogo identifikatora VA ARGS u spisku zamishennya makrosa zaminyuyetsya peredanimi argumentami Dostup do individualnih argumentiv u spisku formalnih parametriv ne zdijsnyuyetsya ni za znachennyam ni za sposobom yakim yih peredano U gcc u spisku formalnih parametriv makrosa mozhut buti yak poznacheni argumenti angl specified arguments tak i peredani variativno div priklad PidtrimkaGNU Compiler Collection pochinayuchi z versiyi 3 0 C Builder 2006 i Visual Studio 2005 1 8 kvitnya 2008 u Wayback Machine pidtrimuyut makrosi zi zminnim chislom argumentiv pri kompilyaciyi kodu yak movoyu C tak i movoyu C Krim togo GCC pidtrimuye variativni makrosi pri kompilyaciyi kodu movoyu Objective C PrikladYaksho potribno podibnij funkciyi dprintf sho prijmaye im ya fajlu i nomer ryadka z yakogo viklikayetsya yak argument mozhna vikoristati takij makros void realdprintf char const file int line char const fmt define dprintf realdprintf FILE LINE VA ARGS dprintf mozhna viklikati yak dprintf Hello world yakij dopovnyuyetsya do realdprintf FILE LINE Hello world abo dprintf d d d 2 2 5 yakij dopovnyuyetsya do realdprintf FILE LINE d d d 2 2 5 AlternativiU deyakih vipadkah alternativoyu variativnim makrosam mozhe stati zvichajnij makroviklik Napriklad takij kod mozhna vikoristati dlya nalagodzhennya ifdef TRACING define TRACE p printf p else define TRACE p endif Yaksho makros TRACING viznacheno pid chas kompilyaciyi viklik makrosa TRACE bude ekvivalentnim vikliku funkciyi printf TRACE Vikonuyetsya ryadok d n LINE Yaksho makros TRACING ne viznacheno pid chas roboti programi povidomlennya ne drukuvatimetsya Zvernit uvagu sho parametri vikliku cogo makrosa slid uklasti v podvijni duzhki U deyakih inshih vipadkah zamist variativnih makrosiv mozhna vikoristati funkcional mov C C i viklik funkciyi Inshij priklad if defined DEBUG MCU define TRACE args printf args else define TRACE args endifDiv takozhVariativna funkciya Variativnij shablonPrimitkiWorking draft changes for C99 preprocessor synchronization http www open std org jtc1 sc22 wg21 docs papers 2004 n1653 htm 31 lipnya 2020 u Wayback Machine Dzherela ros