2011-08-18 10 views
6

Tôi đã nhận được cảnh báo sau khi biên dịch mã nguồn C trong gcc 4.6.1.: bộ biến nhưng không được sử dụng [-Wunused-but-set-variable]

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

tôi giới thiệu đến liên kết này Wunused nhưng có thể nhận được chính xác những gì đang gây ra này warning.Would ai cho tôi biết chi tiết hơn những gì đang gây ra cảnh báo này và làm thế nào chúng ta có thể thoát khỏi nó?

[EDIT] Tôi có đoạn mã sau. Biên dịch cho thấy cảnh báo được đề cập ở trên. Bạn có thể đề nghị tôi làm thế nào có thể sửa nó?

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

Trả lời

5

Bạn cần phải bao gồm các vệ sĩ tiền xử lý xung quanh việc khai báo và khởi tạo của 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 

(điều này giả định rằng bạn vẫn muốn gọi test_function2() ngay cả khi CHECK không được định nghĩa, có lẽ vì tác dụng phụ của nó - nếu không, thì bạn không cần phần #else và bạn có thể kết hợp hai khối #ifdef thành một).

5

Bạn đang đặt biến nhưng sau đó không sử dụng. Ví dụ:

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

Bạn chỉ có thể xóa.

+0

Nhưng tôi * đang * sử dụng nó! Tôi không hiểu tại sao tôi lại thấy lỗi này. Nếu tôi xóa định nghĩa, nó phàn nàn rằng tôi đang sử dụng biến mà không định nghĩa nó. Nếu tôi bao gồm định nghĩa, nó nói rằng tôi không sử dụng nó. Điều gì có thể gây ra cảnh báo này? – endolith

+2

@endolith: Ồ, không bao giờ. Tôi không * sử dụng * nó. Có nghĩa là tôi chỉ thiết lập nó (ở nhiều nơi) và không bao giờ thử nghiệm giá trị là gì, bởi vì tôi chưa viết phần đó. Duh. – endolith

4

Thiết lập một biến được gán cho nó một giá trị (có thể ngầm)

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

Trong chương trình trên, cả hai biến được thiết lập để một giá trị nhưng họ không được sử dụng. Nếu tôi thay thế dòng thứ hai với

int local2 = local1; 

bây giờ tôi đã sử dụng các biến local1 - và những lời cảnh báo nên chỉ 1.

Để thoát khỏi cảnh báo, xóa sự phân công từ mã của bạn. Điều này có thể, lần lượt tạo ra các cảnh báo khác ... :)

2

Điều đó có nghĩa là bạn gán giá trị cho biến, nhưng sau đó bạn không bao giờ đọc giá trị đó sau đó trong mã của bạn (do đó là "verbage", set but not used "). Ví dụ:

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

Chú ý rằng bạn cung cấp cho cả hai usefuluseless giá trị, nhưng bạn chỉ đọc giá trị trong useful. Thông thường, khi tôi nhận được thông báo này, điều đó có nghĩa là tôi đã quên mất một biến hoặc tìm cách để đặt nội tuyến một câu lệnh không còn cần biến đó nữa.

0

Bạn chưa sử dụng BoolTest. Bạn có thể thấy không có sự khác biệt giữa mã của mình và

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