2012-04-30 22 views
7

Tôi cần sử dụng pthreat nhưng tôi không cần chuyển bất kỳ đối số nào cho hàm. Vì vậy, tôi truyền NULL cho hàm trên pthread_create. Tôi có 7 pthreads, do đó, trình biên dịch gcc cảnh báo tôi rằng tôi có 7 tham số không được theo dõi. Làm thế nào tôi có thể xác định các thông số 7 như không sử dụng trong lập trình C? Nếu tôi không định nghĩa các tham số này là không sử dụng, nó có gây ra vấn đề gì không? Cảm ơn bạn trước cho các phản ứng.xác định các thông số không được sử dụng trong C

void *timer1_function(void * parameter1){ 
//<statement> 
} 

int main(int argc,char *argv[]){ 
    int thread_check1; 
    pthread_t timer1; 
    thread_check1 = pthread_create(&timer1, NULL, timer1_function, NULL); 
    if(thread_check1 !=0){ 
     perror("thread creation failed"); 
     exit(EXIT_FAILURE); 
    } 
while(1){} 
return 0; 
} 
+0

Nếu chúng không được sử dụng, nó ngụ ý thứ không có các hoạt động có ý nghĩa được thực hiện cho các biến đó, và (đối với hầu hết các phần) chúng an toàn để loại bỏ. Đó là một cảnh báo, không phải là một lỗi, vì vậy nó * có thể * được bỏ qua. Nó thường không phải là một ý tưởng tốt * để * bỏ qua nó, nhưng bạn * có thể *. – Makoto

+0

@hmjd - C++ cho phép nó, không phải C. – MByD

+2

http://clackoverflow.com/q/7090998/168175 – Flexo

Trả lời

17

Bạn có thể truyền tham số để void như thế này:

void *timer1_function(void * parameter1) { 
    (void) parameter1; // Suppress the warning. 
    // <statement> 
} 
+3

http://stackoverflow.com/a/4851173/168175 có dạng thay thế hoạt động tốt hơn cho 'volatile' rõ ràng là – Flexo

+0

Clever - cảm ơn bạn! –

0

Đó là hoàn toàn tốt đẹp không sử dụng một tham số trong một thân hàm.

Để tránh các cảnh báo trình biên dịch (nếu có trong việc thực hiện của bạn), bạn có thể làm điều này:

void *timer1_function(void * parameter1) 
{ 
    // no operation, will likely be optimized out by the compiler 
    parameter1 = parameter1; 
} 
2

Theo mặc định, GCC không tạo ra cảnh báo này, không phải ngay cả với Wall. Tôi nghĩ rằng cách giải quyết khác được thể hiện trong câu hỏi khác có thể là cần thiết khi bạn không kiểm soát được môi trường, nhưng nếu bạn làm vậy, chỉ cần xóa cờ (-Wunused-parameter).

+0

+1 đây là giải pháp tốt nhất. Cảnh báo này về cơ bản là ngu ngốc. Bất cứ khi nào địa chỉ của một hàm được thực hiện, GCC sẽ tắt cảnh báo "tham số không sử dụng" cho nó, bởi vì chúng được sử dụng trong nội bộ hay không, chúng được sử dụng như một phần của giao diện cần thiết cho hàm. Cá nhân tôi sẽ nói cùng một điều nên áp dụng cho tất cả các chức năng bên ngoài quá ... –

+2

@R Tôi bắt gặp một lỗi trong mã của tôi một vài ngày trước nhờ cảnh báo này. Tôi đã làm một refactor của một số chức năng và gõ 0 thay vì định danh cho một bitmask mà đến như là một tham số chức năng. Kích hoạt -Wextra cho phép tôi ngay lập tức sửa chữa một lỗi tinh vi đã được giới thiệu cách đây vài ngày. –

+2

-1: Tôi thường xuyên tìm thấy lỗi nhờ cảnh báo này được kích hoạt. –

17

GCC có một thuộc tính "thuộc tính" có thể được sử dụng để đánh dấu các tham số không được sử dụng. Sử dụng

void *timer1_function(__attribute__((unused))void *parameter1) 
1

Hai kỹ thuật thường được sử dụng:

1) Bỏ qua tên của tham số chưa sử dụng:

void *timer1_function(void *) { ... } 

2) Thảo luận ra các tên tham số:

void *timer1_function(void * /*parameter1*/) { ... } 

- - Chris

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