Каковы последствия игнорирования:предупреждение:неиспользуемый параметр

StackOverflow https://stackoverflow.com/questions/308277

  •  08-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

  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);
}

Другие советы

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

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

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

}

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

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

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

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

В 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;
}

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

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

Нет.за исключением [ПРАВИТЬ / ПРАВИТЬ код]:как указывали другие, у вас может быть неназначенный выходной параметр.

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top