Известный и переносимый способ подавить предупреждения компилятора C о неиспользуемых переменных (см. неиспользуемые предупреждения параметров в коде C):
#define UNUSED(x) (void)(x)
Я ищу способ обобщить это, чтобы использовать несколько входов (разных типов):
void foo(int a, long b, void* c){
/* Want this: */
ALL_UNUSED(a, b, c);
/* instead of: */
UNUSED(a);
UNUSED(b);
UNUSED(c);
}
Один из способов, который, кажется, делает трюк, - использовать вариационную функцию
static inline void ALL_UNUSED(int dummy, ...) {}
Однако я подозреваю, что это решение нежелательно в глазах экспертов.
Существует ли стандартная совместимость и переносимость (т.е. не используя __attribute__((unused))
) способ сделать вариационную UNUSED() функцию/макрос? Большое спасибо!
ИЗМЕНИТЬ
Кажется, что нет чистого способа делать то, что я просил, в контексте C99 или препроцессора C. Такова жизнь.
В своем ответе ниже @Dabo показывает довольно интересный способ сделать то, что я попросил использовать ряд макросов. Это аккуратно и информативно (по крайней мере, для меня), поэтому я принимаю этот ответ. Тем не менее, я бы не разворачивал его в большом проекте, потому что он достаточно силен, чтобы перевешивать пользу, которую он приносит (в моих глазах). Но здесь люди придут к разным выводам.
Как отмечено ниже, подход использования пустой вариационной функции также не идеален. Хотя это довольно элегантный однострочный, он будет вызывать предупреждения об элементарных переменных (если они есть). Кроме того, вы должны доверять своему компилятору, чтобы полностью его оптимизировать, на что я возражаю в принципе, но что все компиляторы, с которыми я пытался это сделать, действительно делают.
Одним из релевантных случаев является выполнение функций stubbing после этапа разработки интерфейса на высоком уровне. Тогда ваши неиспользуемые переменные будут функциональными аргументами и инициализированы по определению, и следующий подход работает отлично
static inline void UNUSED(int dummy, ...) {}
void foo(int a, long b, void* c){
UNUSED(a, b, b); /* No warnings */
}