0

strerror_r を使用してソケット関数からエラーを取得しようとしていますが、コードがコンパイルされていませんinvlaid conversion from char * to an interrorno.hコードにandを含め、 string.hubuntu 12.04 で実行されている Eclipse ide を使用しています。コードは以下のとおりです。

int err;
char buffer[50];
result=connect(socketHandle, (struct sockaddr *)&remoteSocketInfo, sizeof(sockaddr_in));

   if(result==0)
   {
      printf("\n connect success ");

   }
   else if(result==-1)
   {
       err = strerror_r(errno,buffer,50);// error in place 
       printf("%d",err);
   }
4

3 に答える 3

2

追加する

Include <errno.h>

問題を解決する必要があります


このエラーの他の理由は、ドキュメントによると、

XSI 準拠のシステムでは int を返し、GNU 固有のシステムでは char*を返します。

于 2013-10-11T15:18:22.960 に答える
2

これは、デフォルトで strerror_r() の GNU バージョンが使用されているためです。これには次のシグネチャがあります。

char *strerror_r(int errnum, char *buf, size_t buflen);

_GNU_SOURCEこのルーチンの標準バージョンを取得するために、マクロを未定義にすることができます。何かのようなもの:

#undef _GNU_SOURCE
#include <string.h>

xsi_strerror_r.h必要な場所にのみ含めることができるように、それを独自のヘッダー ファイル ( など) に分離することをお勧めします。または、 strerror_r() の周りのラッパー関数でさえ、未定義_GNU_SOURCEが他の意図しない影響を及ぼさないようにします。例えば:

#ifndef XSI_STRERROR_R
#define XSI_STRERROR_R

#undef _GNU_SOURCE
#include <string.h>

int xsi_strerror_r(int errnum, char *buf, size_t buflen);

#endif

上記はヘッダー ファイル (xsi_strerror_r.h) です。次に、独自のソース ファイルで xsi_strerror_r() の簡単な実装を提供します。

#include "xsi_strerror_r.h"
int xsi_strerror_r(int errnum, char *buf, size_t buflen)
{
    return strerror_r(errnum, buf, buflen);
}

そして、残りのコードでは xsi_strerror_r() のみを使用します。

于 2013-10-11T15:21:53.320 に答える
1

http://linux.die.net/man/3/strerror_rによると、 aまたはstrerror_rを返すことができます。バージョンにはGNU 固有であると書かれているため、GNU を使用している場合は、それが問題なのかもしれません。char *intchar *

于 2013-10-11T15:17:42.250 に答える