2011-08-10 9 views
5

私はdispatchQueue.c:215: warning: control reaches end of non-void function以下のコードから警告しています。
誰でも説明できますか?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 
    } 
} 

}

答えて

6

まあ、dQueue->HEADNULLであれば何が起こるか想像してみてください。

これを修正するには、関数の一番下に妥当な値を戻してみてください。この警告は、値なしで戻りに説明警告に似ている

assert(!"Unreachable code hit"); 
5

あなたの関数のシグネチャは、それがポインタであるとvoidは異なるvoid *を返し示します。

関数が返すものでない場合は、voidを使用してください。

+6

彼はそれを無効にすることはできません。おそらく、 'pthread'の関数です。 – cnicutar

14

voidではない)とのいずれも返さないので、が返されているためです。戻り値が必要ない場合はNULLを返します。 - しかし、あなたは何も返さないあなたはvoid*を返すことになっている関数の終わりに到達するようifは、入力されません。

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

:など、このコードが到達不能であることを述べてアサーションを追加します。制御が関数の終わりに達し、戻り値が見つからない場合、GCCは戻り値のない戻り値を取る。ただし、このためには関数に戻り値が必要です。関数の最後に、コントロールが決してそこに到達しない場合でも、適切な戻り値を返すreturnステートメントを追加します。

プロトタイプから、何かを返すと思われます。

2

これは古い質問です、誰かが(pthreadsのために)これを理解しようとした場合、あなたが返すようにしたいことがあります。

  • pthread_exit(void *retval)(合流可能スレッドの場合)
  • pthread_exit(NULL)
  • (デタッチスレッドの場合)
関連する問題