Предупреждение: переменная установлена, но не используется [-Wunused-but-set-variable]
Я получаю следующее предупреждение при компиляции исходного кода C в gcc 4.6.1
,
warning: variable set but not used [-Wunused-but-set-variable]
Я ссылался на эту ссылку Wunused, но мог точно узнать, что является причиной этого предупреждения. Кто-нибудь расскажет мне более подробно, что вызывает это предупреждение и как мы можем от него избавиться?
[РЕДАКТИРОВАТЬ] У меня есть следующий фрагмент кода. Компиляция показывает вышеупомянутое предупреждение. Не могли бы вы подсказать, как это исправить?
test_function(){
BOOL BoolTest;
BoolTest = test_fucntion2();
#ifdef CHECK
if (!BoolTest) {
misc_StartErrorReport();
misc_ErrorReport("\n test_function2: Input not indexed.\n");
misc_FinishErrorReport();
}
#endif
//
BoolTest is no more used below it.
// }
7 ответов
Вы должны включить защиту препроцессора вокруг объявления и инициализации BoolTest
:
test_function()
{
#ifdef CHECK
BOOL BoolTest = test_function2();
#else
test_function2();
#endif
#ifdef CHECK
if (!BoolTest) {
misc_StartErrorReport();
misc_ErrorReport("\n test_function2: Input not indexed.\n");
misc_FinishErrorReport();
}
#endif
(это предполагает, что вы все еще хотите позвонить test_function2()
даже если CHECK
не определен, предположительно для его побочных эффектов - если нет, то вам не нужно #else
раздел, и вы можете объединить два #ifdef
блоки в одну).
You are setting a variable but then not using it. Например:
int foo = some_expression;
//...code which does not use foo
Вы можете просто удалить его.
Установка переменной - это присвоение ей значения (возможно, неявно)
int main(void) {
int local1, local2;
local1 = 0; /* local1 set to 0 */
local2 = 0; /* local2 set to 0 */
return 0;
}
В приведенной выше программе обе переменные были установлены в значения, но они не использовались. Если я заменю вторую строку
int local2 = local1;
теперь я использовал local1
переменная - и предупреждения должны быть только 1.
Чтобы избавиться от предупреждения, удалите присвоение из своего кода. Это может, в свою очередь, создать другие предупреждения...:)
С g++ 7.x и выше и clang++ 4.x и выше (с использованием C++ 11 или выше), а также с Visual Studio 2017 версии 15.3 и новее (доступно с /std: C++17), вы можете использовать стандартизированный атрибут [[Maybe_unused]].
Например,
int main()
{
int x [[maybe_unused]] = 5;
}
не выдаст предупреждение, даже с -Wunused-variable и лайками.
Это означает, что вы присваиваете значение переменной, но потом никогда не читаете это значение позже в своем коде (отсюда и пошло: "установлено, но не использовано"). Например:
int useful = 10;
int useless = 3;
if (useful) {
//Do stuff
}
Обратите внимание, что вы даете оба useful
а также useless
значения, но вы только читаете значение в useful
, Обычно, когда я получаю это сообщение, это означает, что я забыл о переменной или нашел способ встроить оператор, который больше не нуждается в этой переменной.
https://gcc.gnu.org/gcc-4.6/porting_to.html
Новые предупреждения для неиспользуемых переменных и параметров
Поведение -Wall изменилось и теперь включает новые предупреждающие флаги -Wunused-but-set-variable и (с -Wall -Wextra) -Wunused-but-set-parameter. Это может привести к появлению новых предупреждений в коде, который корректно скомпилирован с предыдущими версиями GCC.
Например,
недействительным fn (недействительным) { int foo; фу = бар (); /* foo никогда не используется. */ }
Выдает следующую диагностику:
предупреждение: переменная "foo" установлена, но не используется [-Wunused-but-set-variable]
Хотя эти предупреждения не приведут к сбою компиляции, часто -Wall используется вместе с -Werror, и в результате новые предупреждения превращаются в новые ошибки.
Чтобы исправить это, сначала посмотрите, можно ли удалить неиспользуемую переменную или параметр без изменения результата или логики окружающего кода. Если нет, аннотируйте его с помощью
__attribute__((__unused__))
.В качестве обходного пути добавьте -Wno-error=unused-but-set-variable или -Wno-error=unused-but-set-parameter.
Вы не использовали BoolTest. Вы можете видеть, что нет никакой разницы между вашим кодом и
test_function(){
#ifdef CHECK
if (!test_fucntion2()) {