Каковы последствия игнорирования: warning: неиспользуемый параметр - PullRequest
20 голосов
/ 21 ноября 2008

Я работаю над проектом C ++ и заметил, что у нас есть ряд предупреждений о неиспользуемых параметрах.

Какой эффект это может иметь, если эти предупреждения игнорируются?

Ответы [ 8 ]

56 голосов
/ 21 ноября 2008

Функция с неиспользуемым параметром может иметь реальную ошибку в следующих случаях:

  1. Имеется параметр output , который не присваивается и не записывается, что приводит к неопределенному значению для вызывающего абонента.

  2. Одним из параметров является указатель на функцию обратного вызова, которую вы должны вызвать и забыть сделать это. Может случиться, если в функции много #ifdef с.

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

Не использовать входные параметры может быть безвредным, но вы можете уменьшить шум, чтобы увидеть полезные предупреждения, явно пометив неиспользуемые входные параметры в начале функции, приведя его void (работает как для C, так и для C ++):

(void)param1;

Или,

#define UNUSED(expr) do { (void)(expr); } while (0)
...

void foo(int param1, int param2)
{
    UNUSED(param2);
    bar(param1);
}

Или пропустить имя параметра (только C ++):

void foo(int param1, int /*param2*/)
{
    bar(param1);
}
14 голосов
/ 03 января 2009

Для gcc-специфического способа отключить предупреждение, вы можете использовать __attribute__((unused)) как

void foo(int a, int b __attribute__((unused))) {

}

Чтобы игнорировать второй параметр. Если ваша программа уже использует технологии GCC, вы можете использовать этот атрибут, чтобы быть на 100% безопасным от такого рода предупреждений.

14 голосов
/ 21 ноября 2008

Если у вас есть много неважных предупреждений, которые не важны для вас, вы можете пропустить важное предупреждение о только что написанной строке кода, которая скрывается в середине их.

1 голос
/ 21 ноября 2008

В C ++ вы можете иметь аргументы по умолчанию:

int sum(int first, int second=0){   // should not give warning
    return first+first;
}

Вы также можете иметь дополнительный аргумент:

int sum(int first, int second){     // should give warning
    first *= 2;
    return first;
}

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

Возможно, это означает, что вы также забыли часть логики функции.

1 голос
/ 21 ноября 2008

Это зависит от того, собираетесь ли вы использовать этот параметр. Э.Г.

const int Size = 12; // intended for use in some other function

char* MakeBuffer(int size)
{
   return new char[Size];
}

В этом коде «размер» не используется, а вместо него используется константа «Размер». Таким образом, предупреждение высветит проблемы такого типа для вас.

Однако, если вы никогда не отступали для использования параметра, его следует просто удалить из сигнатуры метода. Если вам не нужно сопоставлять подпись для виртуального метода или указателя на функцию, в таком случае у вас нет возможности удалить ее.

1 голос
/ 21 ноября 2008

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

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

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

1 голос
/ 21 ноября 2008

Отсутствует. кроме [РЕДАКТИРОВАТЬ]: как указали другие, вы можете иметь неназначенный выходной параметр.

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

0 голосов
/ 21 ноября 2008

Если метод не использует параметр, тогда возникает первый вопрос: почему этот параметр является частью сигнатуры метода? Эти предупреждения имеют смысл, так как это плохой дизайн, к которому они относятся, и, кроме того, есть небольшие издержки, так что всякий раз, когда этот метод вызывается, этот параметр помещается в стек, поэтому лучше всего провести рефакторинг метода и удалить такие параметры, которые не имеют никакого смысла.

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

...