ПрограммированиеFAQ

Как мне передать переменное число параметров в макрос (С++)

Переменное число параметров в макрос можно передавать только в случае использования компиляторов VC 8.0 и старше (MS Visual Studio 2005), либо gcc 3.0 и старше.

Нужно использовать определение __VA_ARGS__

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

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

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

Нужно учесть, что препроцессор С не разрешает не передавать переменный аргумент, что выливается в то, что следующий код приведёт к ошибке:

debug ("A message")

Хотя разрешает передать пустой аргумент.

Препроцессор C++ не настолько строг, поэтому он просто сгенерирует warning.
Для того, чтобы избежать этого, нужно пользоваться оператором ##.

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

В данном случае препроцессор будет особо обрабатывать конструкцию - если переменные параметры не передаются, то запятая перед ##__VA_ARGS__ будет убрана, и сообщения об ошибке не будет. Если же параметр присутствует, то макрос будет развёрнут как обычно.

14 мая 2007

Комментарии [4]

#1
21:43, 19 июля 2011

макросы - зло

#2
22:04, 19 июля 2011

Freem@n
Но иногда очень удобны.

#3
23:51, 19 июля 2011

Ух ты, а faq кто-то все-таки читает!

#4
19:00, 21 июля 2011

ага заглянул чёт делать то нечего

ПрограммированиеFAQ

Тема в архиве.