我在我的代码中使用gethostbyname_r()
函数,我在编译时遇到了错误。
gethostname.cpp:17:错误:未在此范围内声明'gethostbyname_r'
我的代码:
#include<stdio.h>
#include<netdb.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/file.h>
int main()
{
struct hostent hostbuf;
struct hostent *hp = NULL;
char* hostent_buff;
int herr = 0;
int hres = 0;
hres = gethostbyname_r("domain name", &hostbuf,
hostent_buff, 1024, &hp, &herr);
if (NULL == hp)
{
return -1;
}
return 0;
}
任何人都可以帮助我吗? 我可以在Linux和Solaris上使用相同的函数gethostbyname_r()吗?
答案 0 :(得分:1)
简短回答:
#define _BSD_SOURCE
#include <netdb.h>
或
#define _SVID_SOURCE
#include <netdb.h>
更长的答案:
这不是POSIX功能。你问的是Linux。根据手册页,你想要
#include <netdb.h>
以及以下功能测试宏:
glibc的功能测试宏要求(参见
feature_test_macros(7)
):gethostbyname2(), gethostent_r(), gethostbyaddr_r(), gethostbyname_r(), gethostbyname2_r(): _BSD_SOURCE || _SVID_SOURCE
在我的系统上确认这一点,/usr/include/netdb.h
包含:
extern int gethostbyname_r (const char *__restrict __name,
struct hostent *__restrict __result_buf,
char *__restrict __buf, size_t __buflen,
struct hostent **__restrict __result,
int *__restrict __h_errnop);
但是,这是以
为条件的#ifdef __USE_MISC
这可能意味着您既未定义_BSD_SOURCE
也未定义_SVID_SOURCE
,这是获取定义所必需的。
来自features.h
:
__USE_MISC Define things common to BSD and System V Unix.
然后:
#if defined _BSD_SOURCE || defined _SVID_SOURCE
# define __USE_MISC 1
#endif