2011-08-18 4 views
6

Otrzymałem następujące ostrzeżenie podczas kompilowania kodu źródłowego C w gcc 4.6.1.: zestaw zmiennych, ale nieużywany [-Wunused-set-variable]

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

ja skieruję do tego linka Wunused ale może dostać dokładnie to, co jest przyczyną tego warning.Would ktoś może mi powiedzieć dokładniej, co jest przyczyną tego ostrzeżenia i jak możemy się go pozbyć?

[EDIT] Mam następujący fragment kodu. Kompilacja pokazuje powyższe ostrzeżenie. Czy mógłbyś zaproponować mi, jak mogę to poprawić?

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

Odpowiedz

5

Trzeba to strażników preprocesora całym deklaracji i inicjalizacji 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 

(zakładając, że nadal chcesz zadzwonić test_function2() nawet jeśli CHECK nie jest zdefiniowana, przypuszczalnie ze swoich skutków ubocznych - jeśli nie, to nie potrzebujesz sekcji #else i możesz łączyć dwa bloki #ifdef w jeden).

5

Ustawiasz zmienną, ale nie używasz jej. Na przykład:

int foo = some_expression; 
//...code which does not use foo 

Możesz go po prostu usunąć.

+0

Ale ja * ja * używam tego! Nie rozumiem, dlaczego widzę ten błąd. Jeśli usunę definicję, narzeka, że ​​używam zmiennej bez jej definiowania. Jeśli dodaję tę definicję, oznacza to, że jej nie używam. Co może spowodować takie ostrzeżenie? – endolith

+2

@endolith: Oh, nevermind. Nie używam * tego. To znaczy, że ja je tylko ustawiam (w wielu miejscach) i nigdy nie testuję, jaka jest wartość, ponieważ nie napisałem jeszcze tej części. Duh. – endolith

4

Ustawienie zmiennej jest przypisując mu wartość (być może pośrednio)

int main(void) { 
    int local1, local2; 
    local1 = 0; /* local1 set to 0 */ 
    local2 = 0; /* local2 set to 0 */ 
    return 0; 
} 

w programie powyżej, obie zmienne były ustawione na wartości, ale nie były one wykorzystywane. Gdybym zastąpić drugą linię

int local2 = local1; 

teraz użyłem zmiennej local1 - i ostrzeżenia powinny być tylko 1.

Aby pozbyć się ostrzeżenia, usuń zadanie z kodu. Może to z kolei tworzyć inne ostrzeżenia ... :)

2

Oznacza to, że przypisujesz wartość do zmiennej, ale nigdy nie czytasz jej później w kodzie (stąd "verbage", "ustaw, ale nie używaj")). Na przykład:

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

Zauważ, że dajesz obie wartości useful i useless, ale tylko odczytać wartość w useful. Zazwyczaj, gdy otrzymam tę wiadomość, oznacza to, że zapomniałem o zmiennej lub znalazłem sposób na wstawienie instrukcji, która nie potrzebuje już tej zmiennej.

0

Nie użyłeś BoolTest. Możesz zobaczyć, że nie ma różnicy między twoim kodem a

test_function(){ 
#ifdef CHECK 
if (!test_fucntion2()) {