В c ++ 03 и более ранних версиях для отключения предупреждения компилятора о неиспользуемом параметре я обычно использую такой код:
#define UNUSED(expr) do { (void)(expr); } while (0)
Например
int main(int argc, char *argv[])
{
UNUSED(argc);
UNUSED(argv);
return 0;
}
Но макросы не лучшая практика для c ++, поэтому.
Есть ли лучшее решение с стандартом C ++ 11? Я имею в виду, я могу избавиться от макросов?
Спасибо за все!
Для этой цели я использовал функцию с пустым телом:
template <typename T>
void ignore(T &&)
{ }
void f(int a, int b)
{
ignore(a);
ignore(b);
return;
}
Я ожидаю, что любой серьезный компилятор оптимизирует вызов функции, и это заставляет меня замолчать предупреждения.
Вы можете просто опустить имена параметров:
int main(int, char *[])
{
return 0;
}
А в случае с main, вы можете вообще пропустить параметры:
int main()
{
// no return implies return 0;
}
См. «§ 3.6 Начало и завершение» в Стандарте C ++ 11.
Здесь <tuple>
в C ++ 11, который включает в себя готовый к использованию std::ignore
объект, который позволяет нам писать (очень вероятно, без наложения накладных расходов времени выполнения):
void f(int x)
{
std::ignore = x;
}
Ничего эквивалентного нет.
Таким образом, вы застряли с теми же старыми опциями. Вы счастливы полностью опустить имена в списке параметров?
int main(int, char**)
В конкретном случае main
Конечно, вы можете просто пропустить сами параметры:
int main()
Есть также типичные трюки, специфичные для реализации, такие как GCC __attribute__((unused))
,
Чтобы «отключить» это предупреждение, лучше всего избегать написания аргумента, просто напишите тип.
void function( int, int )
{
}
или, если вы предпочитаете, закомментируйте это:
void function( int /*a*/, int /*b*/ )
{
}
Вы можете смешивать именованные и безымянные аргументы:
void function( int a, int /*b*/ )
{
}
С C ++ 17 у вас есть [[Maybe_unused]] атрибут атрибута, например:
void function( [[maybe_unused]] int a, [[maybe_unused]] int b )
{
}
Макросы могут быть не идеальными, но они хорошо справляются с этой задачей. Я бы сказал, придерживаться использования макроса.
Что ты имеешь против старого и стандартного способа?
void f(int a, int b)
{
(void)a;
(void)b;
return;
}
Там нет ничего нового, доступного.
Для меня лучше всего закомментировать имя параметра в реализации. Таким образом, вы избавляетесь от предупреждения, но при этом сохраняете некоторое представление о параметре (так как имя доступно).
У вашего макроса (и любого другого подхода приведения к пустоте) есть и обратная сторона: вы можете использовать параметр после использования макроса. Это может усложнить поддержку кода.