предупреждение: переменная установлена, но не используется [-Wunused-but-set-variable]

Я получаю следующее предупреждение при компиляции исходного кода C в файле gcc 4.6.1.

   warning: variable set but not used [-Wunused-but-set-variable]

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

[EDIT] У меня есть следующий фрагмент кода. Компиляция показывает вышеупомянутое предупреждение. Не могли бы вы подсказать мне, как это можно исправить?

   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.
   // } 

person thetna    schedule 18.08.2011    source источник


Ответы (5)


Вам нужно включить защиту препроцессора вокруг объявления и инициализации 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 в один).

person caf    schedule 19.08.2011

Установка переменной — это присвоение ей значения (возможно, неявно)

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.

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

person pmg    schedule 18.08.2011

Это означает, что вы присваиваете значение переменной, но потом никогда не читаете это значение в своем коде (отсюда и фраза «установить, но не использовать»). Например:

int useful = 10;
int useless = 3;
if (useful) {
    //Do stuff
}

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

person RustyTheBoyRobot    schedule 18.08.2011

С 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-переменной и т.п.

person Carlo Wood    schedule 05.06.2018

Вы не использовали BoolTest. Вы можете видеть, что нет никакой разницы между вашим кодом и

test_function(){
#ifdef CHECK
if (!test_fucntion2()) {
person mahmood    schedule 23.08.2011