Введение

Макро, принимающее переменное число аргументов
Вариадическое макро — это особенность некоторых языков программирования, особенно препроцессора C, позволяющая объявлять макросы, принимающие переменное число аргументов. Макросы с переменным числом аргументов были введены в 1999 году в редакции стандарта языка C ISO/IEC 9899:1999 (C99), а в 2011 году — в редакции стандарта языка C++ ISO/IEC 14882:2011 (C++11). Поддержка вариадических макросов без аргументов была добавлена в C++20 и будет добавлена в C23. И стандарты C99, и C++11 требовали как минимум один аргумент, но начиная с C++20 это ограничение было снято благодаря функциональному макросу. Макрос заменяется своим аргументом при наличии аргументов и опускается в противном случае. Однако, до этого добавления, большинство компиляторов также позволяли передавать ноль аргументов. Правила препроцессора C не позволяют рекурсивно раскрывать имена макросов в аргументе __VA_ARGS__. Однако, это ограничение можно обойти, выполнив до произвольного фиксированного числа рекурсивных раскрытий.

Поддержка

Несколько компиляторов поддерживают макросы с переменным числом аргументов при компиляции кода на C и C++: GNU Compiler Collection 3.0, Visual Studio 2005, GCC также поддерживает такие макросы при компиляции Objective C. Поддержка макросов, принимающих ноль аргументов, была добавлена в GNU Compiler Collection 8, Clang 6 и Visual Studio 2019.

Завершающая запятая

Существует проблема переносимости при генерации завершающей запятой с пустыми аргументами для вариадических макросов в C99. Некоторые компиляторы (например, Visual Studio, если не используется новый препроцессор, соответствующий стандарту).