2011-07-05 36 views
5

Tôi đã đoạn mã sau, và khi biên dịch nó với gcc-4.6 tôi nhận được cảnh báo:Wunused-nhưng-set-biến xử lý cảnh báo

cảnh báo: 'tình trạng' biến thiết lập nhưng không được sử dụng [-Wunused- nhưng-set-biến]

#if defined (_DEBUG_) 
#define ASSERT  assert 
#else       /* _DEBUG_ */ 
#define ASSERT(__exp__) 
#endif 

static inline void cl_plock(cl_plock_t * const p_lock) 
{ 
     status_t status; 
     ASSERT(p_lock); 
     ASSERT(p_lock->state == INITIALIZED); 

     status = pthread_rwlock_unlock(&p_lock->lock); 
     ASSERT(status == 0); 
} 

Khi _DEBUG_ cờ không được thiết lập tôi nhận được cảnh báo. Bất kỳ ý tưởng nào về cách khắc phục cảnh báo này?

Trả lời

3

Bạn có thể thay đổi bạn ASSERT vĩ mô để:

#if defined (_DEBUG_) 
#define ASSERT  assert 
#else       /* _DEBUG_ */ 
#define ASSERT(exp) ((void)(exp)) 
#endif 

Nếu biểu thức không có dụng phụ, sau đó nó nên vẫn được tối ưu hóa ra, nhưng nó cũng nên ngăn chặn các cảnh báo (nếu biểu thức không có mặt -Hiệu ứng, sau đó bạn sẽ nhận được kết quả khác nhau trong gỡ lỗi và xây dựng không gỡ lỗi, mà bạn không muốn hoặc!).

+0

Bạn có ý nghĩa gì bởi tác dụng phụ? – alnet

+1

@alnet: Một biểu thức có tác dụng phụ là biểu thức thay đổi thứ gì đó - ví dụ: 'ASSERT (i ++);'. – caf

+0

Tôi có vấn đề liên quan ngay bây giờ :) [link] (http://stackoverflow.com/questions/6641538/has-no-member-compilation-error) – alnet

1

Bạn có thể bao quanh khai báo biến số status với mệnh đề #ifdef.

#ifdef _DEBUG_ 
    status_t status 
#endif 

EDIT: Bạn phải bao quanh gọi thêm:

#ifdef _DEBUG_ 
    status = pthread_rwlock_unlock(&p_lock->lock); 
#else 
    pthread_rwlock_unlock(&p_lock->lock); 
#endif 

hoặc bạn có thể tắt các thông báo lỗi.

2

Tùy chọn trình biên dịch để tắt cảnh báo biến không sử dụng là -Wno-unused. Để có được hiệu quả tương tự về mặt kĩ chi tiết hơn bạn có thể sử dụng diagnostic pragmas như thế này:

int main() 
{ 
    #pragma GCC diagnostic ignored "-Wunused-variable" 
    int a; 
    #pragma GCC diagnostic pop 
    // -Wunused-variable is on again 
    return 0; 
} 

Đây là, tất nhiên, không phải cầm tay nhưng bạn có thể sử dụng something similar cho VS.

+0

Nếu bạn định làm điều này thì bạn chỉ có thể sử dụng chú thích '__attribute __ ((chưa sử dụng)' trên khai báo. – caf

Các vấn đề liên quan