2012-04-30 13 views
7

Potrzebuję używać PTHreat, ale nie muszę przekazywać żadnych argumentów do funkcji. Dlatego przekazuję NULL do funkcji na pthread_create. Mam 7 pthreadów, więc kompilator gcc ostrzega mnie, że mam 7 niepasujących parametrów. Jak mogę zdefiniować te 7 parametrów jako nieużywane w programowaniu C? Jeśli nie zdefiniuję tych parametrów jako nieużywanych, czy spowoduje to jakiś problem? Z góry dziękuję za odpowiedzi.Definiowanie nieużywanych parametrów w 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

Jeśli nie są używane, oznacza to, że bez znaczących operacji są wykonywane na tych zmiennych i (w większości) są one bezpieczne do pozbycia się. To ostrzeżenie, a nie błąd, więc * może * zostać zignorowane. Zazwyczaj nie jest to dobry pomysł * na * ignorowanie go, ale ty * możesz *. – Makoto

+0

@hmjd - pozwala na to C++, a nie na C. – MByD

+2

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

Odpowiedz

17

Można rzucać parametr do void tak:

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

http://stackoverflow.com/a/4851173/168175 ma alternatywną formę, która działa lepiej dla 'volatile' pozornie – Flexo

+0

Clever - dziękuję! –

0

Jest perfekcyjnie nie stosując parametr w ciele funkcji.

Aby uniknąć ostrzeżenia kompilatora (jeśli w realizacji), można to zrobić:

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

Domyślnie GCC nie produkuje tego ostrzeżenia, nawet z -Wall. Myślę, że obejście pokazane w innym pytaniu może być potrzebne, gdy nie masz kontroli nad środowiskiem, ale jeśli to zrobisz, po prostu usuń flagę (-Wunused-parameter).

+0

+1 To jest najlepsza poprawka. To ostrzeżenie jest zasadniczo idiotyczne. Ilekroć adres funkcji jest zajęty, GCC powinien wyłączyć ostrzeżenia o "nieużywanym parametrze", ponieważ niezależnie od tego, czy są używane wewnętrznie czy nie, są używane jako część wymaganego interfejsu dla funkcji. Osobiście powiedziałbym, że to samo powinno dotyczyć wszystkich funkcji zewnętrznych ... –

+2

@R Zauważyłem błąd w moim kodzie kilka dni temu dzięki temu ostrzeżeniu. Robiłem refaktor niektórych funkcji i wpisałem 0 zamiast identyfikatora maski bitowej, która pojawiła się jako parametr funkcji. Enabling -Wextra pozwoliło mi od razu naprawić subtelny błąd, który został wprowadzony kilka dni temu. –

+2

-1: Regularnie znajduję błędy dzięki aktywowaniu tego ostrzeżenia. –

17

GCC posiada funkcję "atrybutów", która może służyć do oznaczania nieużywanych parametrów. Używać

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

Powszechnie stosowane techniki:

1) pominąć nazwę niewykorzystanej parametr:

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

2) Wykomentuj nazwę parametru:

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

- - Chris