2011-08-10 11 views
5

Mam dispatchQueue.c:215: warning: control reaches end of non-void function ostrzeżenie z kodu poniżej.
Czy ktoś może wyjaśnić, dlaczego?c, kontrola sięga końca funkcji non void c

void *dispatcher_threadloop(void *arg){ 

//thread loop of the dispatch thread- pass the tast to one of worker thread 

dispatch_queue_thread_t *dThread = arg; 
dispatch_queue_t *dQueue; 
dQueue = dThread->queue; 

if (dQueue->HEAD!=NULL){ 
    for(;;){ 
     printf("test"); 
     sem_wait(&(dQueue->queue_task_semaphore)); 
     dThread->current_task = dQueue->HEAD; 
     dQueue->HEAD = dQueue->HEAD->next; 
     dQueue->HEAD->prev = NULL; 
     sem_post(&(dQueue->queue_task_semaphore)); 
     break; 
     //TODO 
    } 
} 

}

Odpowiedz

6

Cóż, wyobraź sobie, co się stanie, jeśli dQueue->HEAD jest NULL: the if nie zostaną wprowadzone, więc można dostać się do końca funkcji która ma zwrócić void* - ale nic nie wróci.

Spróbuj zwrócić jakąś sensowną wartość w dolnej części funkcji, aby to naprawić. Lub dodać twierdzenie, w którym stwierdza się, że kod ten powinien być nieosiągalny, jak:

assert(!"Unreachable code hit"); 
5

Podpis dla funkcji wskazuje zwraca void *, która jest wskaźnikiem i jest inna niż void.

Jeśli twoja funkcja nie ma na celu zwrócić niczego, użyj void.

+6

Nie może uczynić go nieważnym, prawdopodobnie jest funkcją 'pthread'. – cnicutar

14

Ponieważ zgłaszasz to jako void * (nie void) i nie zwracając niczego pod numer. Zwróć NULL, jeśli nie potrzebujesz żadnej wartości zwracanej.

void *dispatcher_threadloop(void *arg) 
1

http://publib.boulder.ibm.com/infocenter/tpfhelp/current/topic/com.ibm.ztpf-ztpfdf.doc_put.cur/gtpm1/m1rhnvf.html

To ostrzeżenie jest podobna do opisanej w zamian ostrzeżenia bez wartości. Jeśli kontrola osiągnie koniec funkcji i nie zostanie wykryty zwrot, GCC przyjmuje zwrot bez wartości zwracanej. Jednak do tego funkcja wymaga wartości zwracanej. Na końcu funkcji dodaj instrukcję return, która zwraca odpowiednią wartość zwracaną, nawet jeśli formant nigdy tam nie dotrze.

Wygląda na to, że z prototypu chcesz coś zwrócić.

2

To stara sprawa, ale jeśli ktoś próbuje dowiedzieć się tego (dla pthreads), może chcesz wrócić:

  • pthread_exit(void *retval) (Dla PŁYCIE wątków)
  • pthread_exit(NULL) (Dla jednorodzinnych wątków)