Неиспользуемый параметр в C ++ 11

В 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? Я имею в виду, я могу избавиться от макросов?

Спасибо за все!

74

Решение

Для этой цели я использовал функцию с пустым телом:

template <typename T>
void ignore(T &&)
{ }

void f(int a, int b)
{
ignore(a);
ignore(b);
return;
}

Я ожидаю, что любой серьезный компилятор оптимизирует вызов функции, и это заставляет меня замолчать предупреждения.

37

Другие решения

Вы можете просто опустить имена параметров:

int main(int, char *[])
{

return 0;
}

А в случае с main, вы можете вообще пропустить параметры:

int main()
{
// no return implies return 0;
}

См. «§ 3.6 Начало и завершение» в Стандарте C ++ 11.

181

Здесь <tuple> в C ++ 11, который включает в себя готовый к использованию std::ignore объект, который позволяет нам писать (очень вероятно, без наложения накладных расходов времени выполнения):

void f(int x)
{
std::ignore = x;
}
38

Ничего эквивалентного нет.

Таким образом, вы застряли с теми же старыми опциями. Вы счастливы полностью опустить имена в списке параметров?

int main(int, char**)

В конкретном случае mainКонечно, вы можете просто пропустить сами параметры:

int main()

Есть также типичные трюки, специфичные для реализации, такие как GCC __attribute__((unused)),

30

Чтобы «отключить» это предупреждение, лучше всего избегать написания аргумента, просто напишите тип.

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 )
{
}
26

Макросы могут быть не идеальными, но они хорошо справляются с этой задачей. Я бы сказал, придерживаться использования макроса.

14

Что ты имеешь против старого и стандартного способа?

void f(int a, int b)
{
(void)a;
(void)b;
return;
}
13

Там нет ничего нового, доступного.

Для меня лучше всего закомментировать имя параметра в реализации. Таким образом, вы избавляетесь от предупреждения, но при этом сохраняете некоторое представление о параметре (так как имя доступно).

У вашего макроса (и любого другого подхода приведения к пустоте) есть и обратная сторона: вы можете использовать параметр после использования макроса. Это может усложнить поддержку кода.

12
По вопросам рекламы [email protected]