8

以下测试代码创建了一个服务器和一个客户端套接字。然后客户端向服务器发送消息,服务器回复。就这样。但我无法编译。线程函数中的所有ASSERT_EQ内容都会引发错误"error: void value not ignored as it ought to be"。我不知道这应该告诉我什么。这里有什么问题?类型无关紧要,因为ASSERT_EQ(1, 1);也会引发错误。

编辑在谷歌的常见问题解答中找到了这个:

问:我的编译器抱怨“没有按照应有的方式忽略 void 值”。这是什么意思?

答:您可能在不返回 void 的函数中使用了 ASSERT_XY()。ASSERT_XY() 只能用于 void 函数。

我该如何理解?

void * serverfunc(void * ptr);  
void * clientfunc(void * ptr);    

TEST(netTest, insert)
{
  pthread_t mThreadID1, mThreadID2;
  ::pthread_create(&mThreadID1, nullptr, serverfunc, nullptr);
  ::sleep(1);
  ::pthread_create(&mThreadID1, nullptr, clientfunc, nullptr);
  ::pthread_join(mThreadID1, nullptr);
  ::pthread_join(mThreadID2, nullptr);        
}

void * serverfunc(void * ptr)
{
  net::ServerSocket serv(IPV4, TCP, 55555,5);
  net::ServerSocket * conn = serv.accept();
  net::Message msg;

  conn->recvmsg(&msg);

  ASSERT_EQ(msg.size(),5);
  ASSERT_EQ(msg[0],1);
  ASSERT_EQ(msg[1],2);
  ASSERT_EQ(msg[2],3);
  ASSERT_EQ(msg[3],4);
  ASSERT_EQ(msg[4],5);

  msg = {9,8,6};
  ASSERT_EQ(msg.size(),3);
  ASSERT_EQ(msg[0],9);
  ASSERT_EQ(msg[1],8);
  ASSERT_EQ(msg[2],6);

  conn->sendmsg(msg);

  ::sleep(1);

  delete conn;
  return 0;
}

void * clientfunc(void * ptr)
{
  net::ClientSocket clie(IPV4, TCP, "localhost",55555);
  net::Message msg;

  msg = {1,2,3,4,5};
  ASSERT_EQ(msg.size(),5);
  ASSERT_EQ(msg[0],1);
  ASSERT_EQ(msg[1],2);
  ASSERT_EQ(msg[2],3);
  ASSERT_EQ(msg[3],4);
  ASSERT_EQ(msg[4],5);

  clie.sendmsg(msg);

  clie.recvmsg(&msg);

  ASSERT_EQ(msg.size(),3);
  ASSERT_EQ(msg[0],9);
  ASSERT_EQ(msg[1],8);
  ASSERT_EQ(msg[2],6);

  return 0;
}
4

4 回答 4

7

问:我的编译器抱怨“没有按照应有的方式忽略 void 值”。这是什么意思?

答:您可能在不返回 void 的函数中使用了 ASSERT_XY()。ASSERT_XY() 只能用于 void 函数。

我该如何理解?

您的函数不返回void,它们返回void*- 即它们返回一些东西(void*是一个指向任何东西的指针),而它们应该什么也不返回。常见问题解答说使用 ASSERT_EQ() 的函数需要具有void返回类型。

于 2012-11-22T22:51:07.557 回答
1

我也有同样的问题,我找到了一个“丑陋”的方法来解决它:

void* your_func(void* ptr)
{
    _your_func(ptr);
    reutrn NULL;
}

void _your_func(void* ptr)
{
    ...
    ASSERT_EQ(1, 1);
    ...
}
于 2013-07-10T02:51:52.807 回答
0

看起来 ASSERT_EQ 只能在具有正确返回类型的函数中调用(这似乎是 void 而你的返回 void *)

就我个人而言,我不喜欢宏的过度使用,但事实就是这样。宏的问题是它混淆了代码,所以你看不到它做错了什么。

所以就写这么一个函数,让serverfunc和clientfunc来调用它。

于 2012-11-22T16:06:01.797 回答
0

按照建议,您应该将void*方法的类型替换为void,return 0return

于 2013-01-24T09:43:55.943 回答