Как мне передать переменное число параметров в макрос (С++)
Переменное число параметров в макрос можно передавать только в случае использования компиляторов 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]