8

次のテストコードは、サーバー ソケットとクライアント ソケットを作成します。次に、クライアントがサーバーにメッセージを送信し、サーバーが応答します。それで全部です。しかし、私はコンパイルできません。すべてASSERT_EQのスレッド関数でエラーが発生します"error: void value not ignored as it ought to be"。私はこれが私に何を伝えるべきか見当がつかない. ここで何が問題なのですか?ASSERT_EQ(1, 1);エラーも発生するため、タイプは無関係です。

EDIT GoogleのFAQでこれを見つけました:

Q:私のコンパイラは、「本来あるべきように無視されない void 値」と文句を言います。これは何を意味するのでしょうか?

A: 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

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

提案されているvoid*ように、メソッドのタイプをvoid、およびreturn 0に置き換える必要がありますreturn

于 2013-01-24T09:43:55.943 に答える
0

ASSERT_EQ は、正しい戻り値の型を持つ関数でのみ呼び出すことができるようです (これは void * を返しますが、これは void のように見えます)。

個人的にはマクロの使いすぎは嫌いですが、それはそれで仕方ありません。マクロの問題は、コードが難読化されるため、何が間違っているのかを確認できないことです。

したがって、そのような関数を作成し、serverfunc と clientfunc を呼び出して呼び出します。

于 2012-11-22T16:06:01.797 に答える