Вариативный макрос

Материал из Seo Wiki - Поисковая Оптимизация и Программирование
Перейти к навигацииПерейти к поиску

Вариативный макрос - возможность препроцессором Си при помощи специального макроса объявлять поддержку различного числа аргументов.

Макрос с переменным числом аргументов был представлен в ревизии ISO/IEC 9899:1999 (C99) стандарта языка программирования Си в 1999. Пока что такие макросы официально не являются частью языка программирования C++, несмотря на то, что множество популярных реализаций C++ поддерживает макросы с различным числом аргументов как расширение, и ожидается, что вариативные макросы могут быть позже добавлены в C++.

Синтаксис объявления

Синтаксис объявления схож с синтаксисом вариативной функции: пропуск "..." используется для обозначения того, что нуль или более аргументов могут быть переданы. При расширении макросом каждый вызов специального идентификатора __VA_ARGS__ в списке замещения макроса заменяется переданными аргументами.

Доступ к индивидуальным аргументам в списке формальных параметров не осуществляется ни по значению, ни по способу, которым они были переданы.

Поддержка

GNU Compiler Collection, начиная с версии 3.0, C++ Builder 2006 и Visual Studio 2005 [1] поддерживают макросы с переменным числом аргументов при компиляции кода как на языке Си, так и на языке C++. Кроме того, GCC поддерживает вариативные макросы при компиляции кода на языке Objective-C.

Пример

Если требуется printf-подобная функция dprintf(), принимающая имя файла и номер строки, из которой вызывается в качестве аргумента, можно использовать следующий макрос: <source lang="c"> void realdprintf (char const *file, int line, char const *fmt, ...);

  1. define dprintf(...) realdprintf(__FILE__, __LINE__, __VA_ARGS__)

</source> dprintf() может быть вызвана как: <source lang="c"> dprintf("Hello, world"); </source> который дополняется до: <source lang="c"> realdprintf(__FILE__, __LINE__, "Hello, world"); </source> или: <source lang="c"> dprintf("%d + %d = %d", 2, 2, 5); </source> который дополняется до: <source lang="c"> realdprintf(__FILE__, __LINE__, "%d + %d = %d", 2, 2, 5); </source>

Альтернативы

В некоторых случаях альтернативой вариативным макросам может служить обычный макровызов. Например, следующий код можно использовать для отладки: <source lang="c">

  1. ifdef TRACING
  2. define TRACE(_p) printf _p
  3. else
  4. define TRACE(_p)
  5. endif

</source> Если макрос TRACING определен во время компиляции, вызов макроса TRACE будет эквивалентен вызову функции printf: <source lang="c"> TRACE(("Выполняется строка %d\n", __LINE__)); </source> Если макрос TRACING не был определен, во время работы программы печать сообщения выполняться не будет. Обратите внимание, что параметры вызова данного макроса должны быть заключены в двойные скобки.

В некоторых других случаях вместо вариативных макросов можно использовать функционал stdargs языков Си/C++ и вызов функции vprintf.

Смотри также

Дополнительные источники

en:Variadic macro

Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....