当函数返回void *时,函数实际返回什么

时间:2013-06-04 00:14:53

标签: c++ multithreading compilation

我正在编写一个多线程应用程序,并且处理新线程的函数声明如下:

void * Client::sendMessage(void *threadid) {
// some code without any return
}

我这样称呼这个功能:

// create new thread for outcomming messages
    pthread_t thread;
    pthread_create(&thread, NULL,
            c->sendMessage, (void *) fd);

它工作得很好,但是当我在这个命令中用这些标志编译它时: g++ main.cpp -Wall -pedantic -Wno-long-long -O0 -ggdb -lncurses -pthread -o ChatApp ,它让我收到这样的消息:

Client.cpp: In static member function ‘static void* Client::sendMessage(void*)’:
Client.cpp:167:1: warning: no return statement in function returning non-void [-Wreturn-type]

所以我的问题是,在汇编过程中,我将如何回归,摆脱这些警告?

3 个答案:

答案 0 :(得分:2)

您将sendMessage函数的地址作为第三个参数传递给pthread_create

调用pthread_create会创建一个新线程,该线程在启动例程(在本例中为您的sendMessage函数)返回时(或在其他几种情况下)终止。从start例程返回一个值相当于将相同的值传递给pthread_exit()。如果该线程调用void*,那么start例程返回的pthread_join值可以用于同一进程中的另一个线程。

它是void*值,因为void*是一个通用指针,而不是指向任何类型的对象。如果要使用此机制将信息从终止线程传递到另一个线程,则需要确定一种机制来执行此操作。如果您不需要传递此类信息,那么您的启动例程返回的内容并不重要;最简单的事情是return nullptr;

答案 1 :(得分:1)

void *与void函数不同。 void *是一个指针,但它可以更安全地指向任何东西,在c ++中你不应该非常使用void *但它应该返回的是一个指针。在这种情况下,您可能只需要返回threadid。顺便说一句,在你的情况下发生的事情是函数默认返回0(所以NULL)也可能没问题,很难从提供的代码量知道

答案 2 :(得分:1)

返回与您的职能合同一致的任何内容。如果真的总是忽略回报,请考虑将您的回报类型更改为无效。