C语言中,非void函数控制流结束时缺少返回值。

5

我从以下代码中得到了dispatchQueue.c:215: warning: control reaches end of non-void function警告。 有人可以解释一下为什么吗?

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
    }
}

}

5个回答

14

你将其声明为void *(而不是void)并且没有返回任何内容。如果你不需要返回值,就返回NULL

void *dispatcher_threadloop(void *arg)

7

想象一下如果dQueue->HEADNULL会发生什么: if不会被执行,因此您将到达函数的末尾,该函数应返回void* - 但是您没有返回任何内容。

尝试在函数底部返回一些合理的值以修复此问题。或者添加一个断言,指出这段代码应该是无法到达的,例如:

assert( !"Unreachable code hit" );

4

您的函数签名表明它返回一个指针void *,这与void不同。

如果您的函数不打算返回任何内容,请使用void


3

这是一个旧问题,但如果有人试图解决这个问题(针对pthread),您可能想要返回:

  • pthread_exit(void *retval) (对于可连接的线程)
  • pthread_exit(NULL) (对于已分离的线程)

1

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

这个警告类似于“无返回值”的警告。如果控制流程到达函数结尾,但没有遇到返回语句,GCC会认为该函数返回一个没有返回值的结果。然而,对于某些函数来说,它们需要有返回值。因此,在函数结尾处添加一个返回语句,并返回一个合适的返回值,即使控制流程永远不会到达那里。
从原型中看,似乎你想要返回一些东西。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接