Spec-Zone.ru › GCC 7

6.20 Макросы с переменным числом аргументов.

В стандарте ISO C 1999 макрос может быть объявлен для приема переменного числа аргументов, подобно функции. Синтаксис определения макроса аналогичен синтаксису функции. Вот пример:

#define debug(format, ...) fprintf (stderr, format, __VA_ARGS__)

Здесь ‘…’ является переменным аргументом. При вызове такого макроса он представляет собой ноль или более токенов до закрывающей скобки, которая завершает вызов, включая любые запятые. Этот набор токенов заменяет идентификатор __VA_ARGS__ в теле макроса везде, где он встречается. Более подробную информацию см. в руководстве по CPP.

GCC давно поддерживает макросы с переменным числом аргументов и использует другой синтаксис, позволяющий присваивать имя переменным аргументам, как и любому другому аргументу. Вот пример:

#define debug(format, args...) fprintf (stderr, format, args)

Это во всех отношениях эквивалентно примеру ISO C, но, возможно, более читаемо и описательно.

GNU CPP имеет два дополнительных расширения для макросов с переменным числом аргументов и позволяет использовать их с любой из вышеприведенных форм определения макроса.

В стандартном C вам не разрешается опускать переменный аргумент полностью; но вы можете передать пустой аргумент. Например, этот вызов недействителен в ISO C, потому что после строки нет запятой:

debug ("A message")

GNU CPP позволяет вам полностью опустить переменные аргументы таким образом. В приведенных выше примерах компилятор будет жаловаться, хотя поскольку расширение макроса все еще имеет дополнительную запятую после строки форматирования.

Для решения этой проблемы CPP ведет себя особым образом для переменных аргументов, используемых с оператором склеивания токенов ‘##’. Если вместо этого вы напишите

#define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)

и если переменные аргументы опущены или пусты, оператор ‘##’ заставляет препроцессор удалить запятую перед ним. Если вы все же предоставите некоторые переменные аргументы в вызове макроса, GNU CPP не будет жаловаться на операцию склеивания, а вместо этого поместит переменные аргументы после запятой. Как и любой другой склеенный аргумент макроса, эти аргументы не расширяются как макросы.

Далее: Экранированные символы новой строки, Предыдущее: Переменная длина, Наверх: Расширения C [Содержание][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-7.5.0/gcc/Variadic-Macros.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API