Intereting Posts
Solaris 11 / Illumos / OmniOS: В каком пакете есть /usr/include/sys/types.h? Какие функции порядка будут называться Точная же командная строка вызывает ошибку в Make еще успешной, если она запускается из оболочки Как принимать пробелы во входных данных на C Где macros C хранятся в памяти и как они потребляют больше памяти по сравнению с функциями? Хороший генератор случайных чисел для C В функции «APR_DECLARE»: ошибка: ожидаемые спецификаторы декларации до «apr_strerror» Это неопределенное поведение в C / C ++ Получить адрес строки-константы в C Как предотвратить SIGINT в дочернем процессе от распространения и уничтожения родительского процесса? Путаница относительно заявления printf Отсоедините самый старший бит в слове (int32) Makefile: нет правила для создания цели Как функция WSAStartup инициирует использование Winsock DLL? Требования к поведению указателя к летучести, указывающего на энергонезависимый объект

Что означает синтаксис #define?

Я натолкнулся на это, не понимаю.

#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__)