Я работаю над проектом на С++, и я заметил, что у нас есть несколько предупреждений о неиспользуемых параметрах.
Каким может быть эффект, если эти предупреждения игнорируются?
Я работаю над проектом на С++, и я заметил, что у нас есть несколько предупреждений о неиспользуемых параметрах.
Каким может быть эффект, если эти предупреждения игнорируются?
Функция с неиспользуемым параметром может иметь реальную ошибку в следующих случаях:
Существует параметр output, который не назначается или не записывается, что приводит к значению undefined для вызывающего.
Один из параметров - это указатель функции обратного вызова, который вы должны вызывать и забываете сделать это. Может случиться, если в функции много #ifdef
.
Вы объявляете локальную переменную с тем же именем, которая затеняет параметр и впоследствии использует неправильное значение в функции.
Не использовать входные параметры может быть безвредным, но вы можете уменьшить шум, чтобы увидеть полезные предупреждения, явно указав неиспользуемые входные параметры в начале функции путем литья это для void
(работает как для C, так и для С++):
(void)param1;
Или
#define UNUSED(expr) do { (void)(expr); } while (0)
...
void foo(int param1, int param2)
{
UNUSED(param2);
bar(param1);
}
Или опустить имя параметра (только С++):
void foo(int param1, int /*param2*/)
{
bar(param1);
}
Если у вас есть много несущественных предупреждений, которые не важны для вас, вы можете упустить важное предупреждение о строке кода, который вы только что написали, который скрывается посреди них.
Для gcc-специфического способа отключения предупреждения вы можете использовать __attribute__((unused))
как
void foo(int a, int b __attribute__((unused))) {
}
Чтобы игнорировать второй параметр. Если ваша программа уже использует технологии GCC, вы можете использовать этот атрибут на 100% безопаснее от такого предупреждения.
Отсутствует. кроме [EDIT]: как указывали другие, у вас может быть непризнанный выходной параметр.
Вы должны очистить их, потому что во многих случаях я видел, как разработчики игнорировали важные предупреждения, которые были "скрыты" среди большого количества предупреждений, и они настолько привыкли видеть предупреждения, о которых они никогда не обращали на них внимания. Я стараюсь всегда иметь нулевые предупреждения и устанавливать предупреждения компилятора на максимальный уровень.
Это означает, что вы написали функцию, которая принимает параметр, но не использует параметр. Это безопасно, но в некоторых случаях это может указывать на ошибки.
Как правило, вы можете отключить это предупреждение, удалив имя параметра, оставив его анонимным, но это может быть нежелательно в зависимости от того, почему этот параметр не используется.
Я предлагаю вам отключить предупреждение, если это затруднит поиск реальных проблем.
Это зависит от того, собираетесь ли вы использовать параметр. Например.
const int Size = 12; // intended for use in some other function
char* MakeBuffer(int size)
{
return new char[Size];
}
В этом коде "размер" не используется, а вместо этого используется константа "Размер". Поэтому предупреждение будет выделять проблемы этого типа для вас.
Однако, если вы никогда не отступали от использования параметра, его следует просто удалить из подписи метода. Если вам не нужно сопоставить подпись для виртуального метода или указателя функции, если это случай, то у вас нет возможности удалить его.
В С++ у вас могут быть аргументы по умолчанию:
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;
}
Если у вас есть параметр, который вы не используете, и он не установлен по умолчанию, вы должны получить предупреждение, потому что вы просите программу передать дополнительные значения в стек, на которые никогда не ссылаются, и поэтому делает больше работы, чем следует.
Возможно, это означает, что вы тоже забыли часть логики функций.
Если метод не использует параметр, тогда возникает первый вопрос, почему именно этот параметр является частью сигнатуры метода в первую очередь. Эти предупреждения имеют смысл, так как это плохой дизайн, на который они ссылаются, и, кроме того, есть немного накладных расходов, а при каждом вызове этого метода этот параметр помещается в стек, поэтому лучше всего реорганизовать метод и удалить такие параметры, которые не используются.
Сказав это, оставив эти параметры не повредит много, за исключением небольших накладных расходов, о которых я упоминал.