Предупреждение: переменная установлена, но не используется [-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()) {
Другие вопросы по тегам