Я натолкнулся на это, не понимаю.
#define IDEBUG(a...)
Что означает «(a …)»?
Это переменный макрос .
Составляя дословно на странице:
Макрос может быть объявлен так, чтобы принимать переменное количество аргументов, как может функционировать. Синтаксис для определения макроса аналогичен синтаксису функции. Вот пример:
#define eprintf(...) fprintf (stderr, __VA_ARGS__)
Этот вид макроса называется переменным. Когда макрос вызывается, все токены в списке аргументов после последнего именованного аргумента (этот макрос не имеет), включая любые запятые, становятся аргументом переменной. Эта последовательность токенов заменяет идентификатор VA_ARGS в макрообъекте, где бы он ни появлялся . Таким образом, мы имеем это разложение:
eprintf ("%s:%d: ", input_file, lineno) ==> fprintf (stderr, "%s:%d: ", input_file, lineno)
И для этой конкретной формы, цитируя далее на странице:
Если ваш макрос сложный, вам может понадобиться более описательное имя для аргумента переменной, чем
__VA_ARGS__
. CPP разрешает это, как расширение. Вы можете написать имя аргумента непосредственно перед `… ‘; это имя используется для аргумента переменной. Можно было бы написать макрос eprintf выше#define eprintf(args...) fprintf (stderr, args)
Переменное количество параметров. См. Переменные macros
Это вариационный макрос.
Вариадический макрос – это макрос, который принимает переменное количество аргументов. Эта функция была введена на C99.
Форма
#define IDEBUG(a...) printf(a)
с параметром a...
является расширением GNU, a
дает имя идентификатору __VA_ARGS__
.
Стандартная форма C99 будет
#define IDEDBUG(...) printf(__VA_ARGS__)