2013-10-11 67 views
0

我想使用strerror_r从套接字函数中获取错误,但代码没有编译。我得到的错误为invlaid conversion from char * to an int。我在我的代码中包含了errorno.hstring.h,我使用的是运行在Ubuntu 12.04上的eclipse ide。代码如下。编译错误,同时获取c代码中的错误号

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); 
    } 
+0

'strerror_r'返回'char *'而不是'int'。 –

+0

“我在我的代码中包含了'errorno.h'和'string.h'” - 然后请向我们展示带有'#include'指令的代码。显示(复制粘贴)代码比描述代码的外观总是更好。 (如果你真的包含'errorno.h',你会得到一个错误信息;它是'errno.h'。)请复制并粘贴错误消息,而不是重新输入。看似微妙的细微差别可能很重要。 http://sscce.org/ –

回答

2

这是因为默认情况下的GNU版本strerror_r()的使用,它具有以下特征:

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()在你的代码的其余部分。

+0

有没有办法让错误号码为整数? –

+0

'#ifdef'是不必要的。如果宏没有被定义,'#undef'什么都不做。 –

+1

@SanthoshPai:当然,这就是'errno'。 –

1

http://linux.die.net/man/3/strerror_rstrerror_r可以返回一个char *intchar *版本说它是GNU特有的,所以如果你使用GNU,也许这就是问题所在。

+0

我看到了一个函数原型返回int的地方。现在如何获得错误号码? –

+0

@SanthoshPai,我不确定你在问什么 - 错误号被作为参数传递给strerror_r。 –

+0

@SanthoshPai为什么不只是'printf(“错误:%d \ n”,errno);'那么? – technosaurus

2

添加

Include <errno.h> 

应该解决的问题


注意,其他原因错误According to docs可能是,

返回上兼容XSI系统INT并在GNU特定系统上返回char *。

+0

我已经这样做 –