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

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

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

Макрос с переменным числом аргументов был представлен в ревизии ISO/IEC 9899:1999 (C99) стандарта языка программирования Си в 1999. Также такие макросы были введены в ISO/IEC 14882:2011 (C++11) стандарта языка программирования C++ в 2011 году[1].

Содержание

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

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

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

Поддержка

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

Пример

Если требуется printf-подобная функция 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 не был определен, во время работы программы печать сообщения выполняться не будет. Обратите внимание, что параметры вызова данного макроса должны быть заключены в двойные скобки.

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

См. также

  • Вариативная функция

Примечания

  1. Working draft changes for C99 preprocessor synchronization - http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm

Источники



Wikimedia Foundation. 2010.

Игры ⚽ Нужно решить контрольную?

Полезное


Смотреть что такое "Вариативный макрос" в других словарях:

  • Макрос — Для термина «Макрос» см. другие значения. Мáкрос (от англ. macros, мн.ч. от macro) программный объект, который во время вычисления заменяется на новый объект, создаваемый определением макроса на основе его аргументов, затем выражается… …   Википедия

  • Макрокоманда — Эту статью следует викифицировать. Пожалуйста, оформите её согласно правилам оформления статей. Для термина «Макрос» см. другие значения. Макрокоманда или макрос (от греч. μακρός большой, долгий;) …   Википедия

  • Макросы — У термина «Макрос» существуют и другие значения. Макрос (от англ. macros, мн.ч. от macro) программный объект, при обработке «развёртывающийся» в последовательность действий или команд. Содержание 1 Макросы в прикладных программах …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»